原标题:微软剑桥研究院153页最新GAN教程(附代码)

人生苦短我用GAN

  • Python介绍

【导读】Sebastian
Nowozin在机器学习夏季课程(MLSS
2018年9月)做了关于GAN的教学,153页PPT详尽的解释了GAN的发展脉络和最新进展,此外他所提供原版大小为286MB
的pptx中包含大量动画效果,对课程的理解很有帮助。

首先声明一下,本教程面向入门吃瓜群众,大牛可以绕道,闲话不多说,先方一波广告。(高级GAN玩法),怎么说,我越来越感觉到人工智能正在迎来生成模型的时代,以前海量数据训练模型的办法有点揠苗助长,看似效果很好,实际上机器什么卵都没有学到(至少从迁移性上看缺少一点味道,不过就图片领域来说另当别论,在CV领域监督学习还是相当成功)。
但是问题来了,GAN这么屌这么牛逼,我怎么搞?怎么入门?谁带我?慌了!

脚本语言;
简单、易学、免费、开源、可移植性好、面向对象、可扩展、丰富的库等等

Sebastian
Nowozin是微软剑桥研究院首席研究院,专注于无监督于表示学习。他在GAN领域做了大量的工作,同时也是著名的f-GAN的作者。

莫慌,50行代码你就可以成为无监督学习大牛

我最讨厌那些,嘴里一堆算法,算法实现不出来的人。因为我喜欢看到结果啊!尤其是一些教程,就是将论文,鸡巴论文奖那么多有什么用?你码代码给我看啊,我不知道数据是什么,不知道输入维度是什么,输出什么,里面到底发生了什么变化我怎么学?这就有点像,典型的在沙漠里教你钓鱼,在我看来,论文应该是最后才去看的东西。但是问题在于,你要有一个入门的教程啊。我想这是一个鸿沟,科研里面,理论和动手的鸿沟。
这篇教程就是引路人了。欢迎加入生成模型队伍。这个教程会一直保持更新,因为科技每天变幻莫测,同时我还会加入很多新内容,改进一些在以后看来是错误的说法。

首先,我们废话不多说了,直接show you the code:

import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pyplot as plt
from scipy import stats


def generate_real_data_distribution(n_dim, num_samples):
    all_data = []
    for i in range(num_samples):
        x = np.random.uniform(0, 8, n_dim)
        y = stats.lognorm.pdf(x, 0.6)
        all_data.append(y)
    all_data = np.array(all_data)
    print('generated data shape: ', all_data.shape)
    return all_data


def batch_inputs(all_data, batch_size=6):
    assert isinstance(all_data, np.ndarray), 'all_data must be numpy array'
    batch_x = all_data[np.random.randint(all_data.shape[0], size=batch_size)]
    return Variable(torch.from_numpy(batch_x).float())


def main():
    # 给generator的噪音维数
    n_noise_dim = 30
    # 真实数据的维度
    n_real_data_dim = 256
    num_samples = 666
    lr_g = 0.001
    lr_d = 0.03
    batch_size = 6
    epochs = 1000

    real_data = generate_real_data_distribution(n_real_data_dim, num_samples=num_samples)
    print('sample from real data: n', real_data[: 10])

    g_net = nn.Sequential(
        nn.Linear(n_noise_dim, 128),
        nn.ReLU(),
        nn.Linear(128, n_real_data_dim)
    )

    d_net = nn.Sequential(
        nn.Linear(n_real_data_dim, 128),
        nn.ReLU(),
        nn.Linear(128, 1),
        nn.Sigmoid()
    )

    opt_d = torch.optim.Adam(d_net.parameters(), lr=lr_d)
    opt_g = torch.optim.Adam(g_net.parameters(), lr=lr_g)

    for epoch in range(epochs):
        for i in range(num_samples // batch_size):
            batch_x = batch_inputs(real_data, batch_size)
            batch_noise = Variable(torch.randn(batch_size, n_noise_dim))

            g_data = g_net(batch_noise)

            # 用G判断两个输出分别多大概率是来自真正的画家
            prob_fake = d_net(g_data)
            prob_real = d_net(batch_x)

            # 很显然,mean里面的这部分是一个负值,如果想整体loss变小,必须要变成正直,加一个负号,否则会越来越大
            d_loss = -torch.mean(torch.log(prob_real) + torch.log(1 - prob_fake))
            # 而g的loss要使得discriminator的prob_fake尽可能小,这样才能骗过它,因此也要加一个负号
            g_loss = -torch.mean(torch.log(prob_fake))

            opt_d.zero_grad()
            d_loss.backward(retain_variables=True)
            opt_d.step()

            opt_g.zero_grad()
            g_loss.backward(retain_variables=True)
            opt_g.step()

            print('Epoch: {}, batch: {}, d_loss: {}, g_loss: {}'.format(epoch, i, d_loss.data.numpy()[0],
                                                                        g_loss.data.numpy()[0]))

if __name__ == '__main__':
    main()

这些代码,总共,也就是90行,核心代码50行,基本上,比你写一个其他程序都端,什么红黑算法,什么排序之类的。我个人比较喜欢简约,我很多时候不喜欢太鸡巴隆昌的代码。

  • Python安装

在训练 GAN
方面似乎有两三个阵营:第一个当然就是GAN的发明Ian
Goodfellow以及他所供职的OpenAI和谷歌的一帮研究人员;**
第二个强大的阵营也就是以这篇教程作者Sebastian
Nowozin 为代表的微软阵营**;第三就是其他了

直接开始训练吧

这个GAN很简单,三部分:

  • real data生成,这个real
    data我们怎么去模拟呢?注意这里用的数据是二维的,不是图片,图片是三维的,二维你可以看成是csv,或者是序列,在这里面我们每一行,也就是一个样本,是sample自某个分布的数据,这里用的分布式lognorm;
  • d_net 和
    g_net,这里两个net都是非常小,小到爆炸,这如果要是用tensorflow写就有点蛋疼了,我选择PyTorch,一目了然;
  • loss,loss在GAN中非常重要,是接下来的重点。

OK,一阵复制粘贴,你就可以训练一个GAN,这个GAN用来做什么?就是你随机输入一个噪音,生成模型将会生成一个和lognorm分布一样的数据。也就是说,生成模型学到了lognrom分布。这能说明什么?神经网络学到了概率!用到图片里面就是,他知道哪个颜色快可能是什么东西,这也是现在的CycleGAN,
DiscoGAN的原理。

linux系统:判断是否安装 python -v
Windows系统: 下载软件安装即可

此次教程主要有以下几个部分:

我吃饭去了

未完待续…

  • 最初的步骤

概率模型

来了

继续刚才的,好像我写的文章没有人看啊,伤感。自己写自己看吧,哎,我骚味改了一下代码,loss函数部分,之前的写错了,我偷一张图把。

图片 1

这个是公式,原始GAN论文里面给的公式,但是毫无疑问,正如很多人说的那样,GAN很容易漂移:

Epoch: 47, batch: 66, d_loss: 0.7026655673980713, g_loss: 2.0336945056915283
Epoch: 47, batch: 67, d_loss: 0.41225430369377136, g_loss: 2.1994106769561768
Epoch: 47, batch: 68, d_loss: 0.674636960029602, g_loss: 1.5774009227752686
Epoch: 47, batch: 69, d_loss: 0.5779278874397278, g_loss: 2.2797725200653076
Epoch: 47, batch: 70, d_loss: 0.4029145836830139, g_loss: 2.200833559036255
Epoch: 47, batch: 71, d_loss: 0.7264774441719055, g_loss: 1.5658557415008545
Epoch: 47, batch: 72, d_loss: 0.46858924627304077, g_loss: 2.355680227279663
Epoch: 47, batch: 73, d_loss: 0.6716371774673462, g_loss: 1.7127293348312378
Epoch: 47, batch: 74, d_loss: 0.7237206101417542, g_loss: 1.4458404779434204
Epoch: 47, batch: 75, d_loss: 0.9684935212135315, g_loss: 1.943861961364746
Epoch: 47, batch: 76, d_loss: 0.4705852270126343, g_loss: 2.439894199371338
Epoch: 47, batch: 77, d_loss: 0.4989328980445862, g_loss: 1.5290288925170898
Epoch: 47, batch: 78, d_loss: 0.44530192017555237, g_loss: 2.9254989624023438
Epoch: 47, batch: 79, d_loss: 0.6329593658447266, g_loss: 1.7527830600738525
Epoch: 47, batch: 80, d_loss: 0.42348209023475647, g_loss: 1.856258749961853
Epoch: 47, batch: 81, d_loss: 0.5396828651428223, g_loss: 2.268836498260498
Epoch: 47, batch: 82, d_loss: 0.9727945923805237, g_loss: 1.0528483390808105
Epoch: 47, batch: 83, d_loss: 0.7551510334014893, g_loss: 1.508225917816162
Epoch: 47, batch: 84, d_loss: 2.4204068183898926, g_loss: 1.5375216007232666
Epoch: 47, batch: 85, d_loss: 1.517686128616333, g_loss: 0.6334291100502014
Epoch: 47, batch: 86, d_loss: inf, g_loss: 0.7990849614143372
Epoch: 47, batch: 87, d_loss: nan, g_loss: nan
Epoch: 47, batch: 88, d_loss: nan, g_loss: nan
Epoch: 47, batch: 89, d_loss: nan, g_loss: nan
Epoch: 47, batch: 90, d_loss: nan, g_loss: nan
Epoch: 47, batch: 91, d_loss: nan, g_loss: nan

你如果train一下的话会发现,到一定程度就会nan,这个nan我就无法理解了,按道理来说,从loss来看我们定义的来自以log,如果为无穷那么应该是log(0)了,但是我们的discriminator出来的函数是sigmoid啊,sigmoid不可能为0,只看是0-1且不包括闭区间。这个问题比较玄学。

既然nan的话,我也不深究是因为啥了,总之这个重点在于loss,因为后面GAN的变种基本上都是在loss的训练形式上。

挑选合适的编辑器。
#符号右面的内容都是注释
Linux系统下运行:chmod a+x helloworld.py
echo $PATH 来显示PATH变量
help()帮助了解命令含义 q退出

GANs的几个示范应用

GAN 生成mnist

我们现在玩一下mnist把。

  • 基本概念

评价原则

交流

我见了一个GAN群,加我微信让我拉进来。jintianiloveu,
顺便下载一个我做的app吧,内侧中,专门用来看美女图片的,你懂得。。传送门

数:整数、长整数、浮点数和复数。
字符串:”””,转义符,Unicode字符。
变量
标识符命名:大小写敏感、字母数字下划线(开头不能有数字)
对象
逻辑行:用;隔开,清晰理解。

GAN 模型

  • 运算符和表达式
  • 差异性与f-GAN 家族
  • 基于积分概率度量(IPM)的GAN: MMD
  • 基于积分概率度量(IPM)的GAN: Wasserstein GANs

位运算 左移、右移、位与、位或、位异或
运算符优先级

问题与如何修正:模式崩溃(modecollapse)与不稳定性(Instability)

  • 控制流

隐式模型

if、while、for、break、continue

开放性研究问题

  • 函数

GAN网络是近两年深度学习领域的新秀,一时风头无两。从计算机视觉顶会盛会CVPR
2018接受的论文统计就可见一斑:根据Google Research的研究科学家Jordi
Pont-Tuset做的一个统计,它通过查看这些论文的类型,看到了未来深度学习的发展趋势。结果,他发现生成对抗网络(GAN)强势出击,大有取代“深度学习”(Deep
Learning)之势。

形参与实参。调用函数时,实参值赋给形参。
局部变量:函数内部定义的变量与外部完全没有关系。产生效果的区域成为局部作用域。
全局变量:定义全局变量。在函数内部使用global语句。(不推荐)
默认参数值:def func(a, b=5)是有效的,但是def func(a=5, b)是
无效的。
关键参数:我们可以只给我们想要的那些参数赋值。
return语句:没有返回值的return语句等价于return
None。None是Python中表示没有任何东西的特殊类型。
文档字符串:方便程序的阅读理解。

下面这张图展示了CVPR
2018的论文题目中,关键词GAN、Deep,以及LSTM的对比:

  • 模块

图片 2

sys模块:sys模块包含了与Python解释器和它的环境有关的函数。
.pyc文件: 字节编译的文件 ,这些文件以.pyc作为扩展名。
from..import语句: from sys import argv语句。
模块的name:获取模块的名称。main为当前程序。
制造你自己的模块:记住这个模块应该被放置在我们输入它的程序的同一个目录中,或者在sys.path所列目录之一。
dir():内建的dir函数来列出模块定义的标识符。标识符有函数、类和变量。

在普通的“深度学习”走下坡路的同时,GAN慢慢的成为新宠,统计显示有8%的论文标题中含有GAN(这一数据相比2017年增长了2倍多)。

  • 数据结构

此外用尽字母表的各种GAN的变体 X-GAN
的论文数量也是急剧增加:

列表:len(list)、list.append、list.sort、del list[0]
元组:元组和字符串一样是不可变的,即你不能修改元组。元组通过圆括号中用逗号分割的项目定义。
字典:它们的键/值对用冒号分割,而各个对用逗号分割,所有这些都包括在花括号中。
赋值:d[key]= value
删除:del d[key]
迭代出每一项:for name,address in ab.items():
序列:列表、元组、字符串都属于序列。序列的两个特点:索引操作符和切片操作符。
引用:当你创建一个对象并给它赋一个变量的时候,这个变量仅仅 引用
那个对象,而不是表示这个对象本身!
字符串方法:
in操作符用来检验一个给定字符串是否为另一个字符串的一部分。
find方法用来找出给定字符串在另一个字符串中的位置,或者返回-1以表示找不到子字符串。
str类也有以一个作为分隔符的字符串join序列的项目的整洁的方法,它返回一个生成的大字符串。

图片 3

  • 面向对象编程
  • 后台回复“GANMLSS” 就可以获取最新PPT下载链接~

self:类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是
在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本
身,按照惯例它的名称是self。
init方法:
init方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希望的初始化

类与对象的方法:类的变量
由一个类的所有对象(实例)共享使用。对象的变量
由类的每个对象/实例拥有。
继承:基本类的init方法专门使用self变量调用。

参考链接:

  • 输入输出

模式可以为读模式(’r’)、写模式(’w’)或追加模式(’a’)。
使用file类的write方法来写文件,最后我们用close关闭这个文件。
使用readline方法读文件的每一行。
存储与去存储没看懂。

  • 异常

附PPT全文:

用try..except语句来处理异常。
用raise来引发异常。
try…finally异常发生后有语句仍然执行。

图片 4

  • python标准库

图片 5

sys模块。
os模块。

图片 6

  • 更多python内容

图片 7

init(self, …)
del(self)
str(self)
lt(self, other)
getitem(self, key)
len(self)
列表生成式
单语句块
lambda语句
exec语句用来执行储存在字符串或文件中的Python语句:
>>> exec ‘print “Hello World”
eval语句用来计算存储在字符串中的有效Python表达式。
>>> eval(‘2*3’)
assert语句用来声明某个条件是真的。当assert语句失败的时候,会引发一个AssertionError。
repr函数

图片 8


图片 9

书中代码整理在Github上:《A Byte of
Python》

图片 10

图片 11

图片 12

图片 13

图片 14

图片 15

图片 16

图片 17

图片 18

图片 19

图片 20

图片 21

图片 22

图片 23

图片 24

图片 25

图片 26

图片 27

图片 28

图片 29

图片 30

图片 31

图片 32

图片 33

图片 34

图片 35

图片 36

图片 37

图片 38

图片 39

图片 40

图片 41

图片 42

图片 43

图片 44

图片 45

图片 46

图片 47

图片 48

图片 49

图片 50

图片 51

图片 52

图片 53

图片 54

图片 55

图片 56

图片 57

图片 58

图片 59

图片 60

图片 61

图片 62

图片 63

图片 64

图片 65

图片 66

图片 67

图片 68

图片 69

图片 70

图片 71

图片 72

图片 73

图片 74

图片 75

图片 76

图片 77

图片 78

图片 79

图片 80

图片 81

图片 82

图片 83

图片 84

图片 85

图片 86

图片 87

图片 88

图片 89

图片 90

图片 91

图片 92

图片 93

图片 94

图片 95

图片 96

图片 97

图片 98

图片 99

图片 100

图片 101

图片 102

图片 103

图片 104

图片 105

图片 106

图片 107

图片 108

图片 109

图片 110

图片 111

图片 112

图片 113

图片 114

图片 115

图片 116

图片 117

图片 118

图片 119

图片 120

图片 121

图片 122

图片 123

图片 124

图片 125

图片 126

图片 127

图片 128

图片 129

图片 130

图片 131

图片 132

图片 133

图片 134

图片 135

图片 136

图片 137

图片 138

图片 139

图片 140

图片 141

图片 142

图片 143

-END-

专 · 知

人工智能领域26个主题知识资料全集获取与加入专知人工智能服务群:
欢迎微信扫一扫加入专知人工智能知识星球群,获取专业知识教程视频资料和与专家交流咨询!

请PC登录www.zhuanzhi.ai或者点击阅读原文,注册登录专知,获取更多AI知识资料!

请加专知小助手微信(扫一扫如下二维码添加),加入专知主题群(请备注主题类型:AI、NLP、CV、
KG等)交流~

AI 项目技术 & 商务合作:bd@zhuanzhi.ai,
或扫描上面二维码联系!

请关注专知公众号,获取人工智能的专业知识!返回搜狐,查看更多

责任编辑: