阅读小结:Generative Adversarial Nets

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Layumi1993/article/details/52328594

这是Ian Goodfellow大神的2014年的paper,最近很火,一直没看,留的坑。

中文应该叫做对抗网络

代码是用pylearn2写的  github地址为:https://github.com/goodfeli/adversarial/


What:

同时驯良两个模型:一个生成模型G(获得数据分布),一个区分模型D(预测输入是真实的,还是G中产生的)

G的训练目标就是最大化D犯错误的可能,这样G这个生成模型就越厉害。

这个框架很像两个人在玩游戏。

整个系统里只用了bp,没有马尔可夫链或者其他推理的神经网络


读前疑问:

G的输入是label么,还是一个随机高斯噪声。

如果是label,怎么用神经网络写一个生成模型G,用deconv么。。。


How:

1.G是一个简单的神经网络 (比如:一个全连接隐层) 他的输入是一个向量(100维)然后产生一张图作为输出。

2.D也是一个简单的神经网络(比如:一个全连接隐层)他的输入是一张图像,然后产生一个置信度(0-1)

假设B为BatchSize.

3.G的训练如下:

a.创建B个随机100维的向量,比如[-1,1]

b.G中前馈向量得到新的图片image

c.D中前馈图片image得到 得分

d.使用cross entropy 来分类,D中应该认为这些生成的图片(fake)为label = 0,如果D的打分是label=0,那么G的error应该比较低(因为G do a good job 骗了D)

e.执行一个bp (不更新D),得到image每个像素的gradient

d.利用这个gradient,更新G


4.D的训练如下:

a.从G中创建B/2张图片 ground truth label是0

b.从训练集中选择B/2张图片  gt label是1

c.把它们放到一个batch里面

d.在D中前馈这个batch

e.cross entropy error

f.update D


训G一个batch,然后训D一个或者更多batch  (有时候D比较慢,所以要的迭代比G多)

我check了他的模型 (tfd_pretrain/train.yaml)

G用了一个RectifiedLinear和Sigmoid  (这个RectifiedLinear带参数的,不是Relu)

D用了两个Maxout和一个Sigmoid(这个Maxout也带参数的)



目前自己的实现计划:

1. 数据集采用Minist  28*28

2. G的输入采用为32*32 的[-1,1]rand

3. G采用 3*3  1*1  3*3  三层conv  stride1 前两个con后接relu

4. D采用原始的MinistCNN分类网络将最后改为 2分类

5. 使用图模型,所以

update G:fix D  forward G+D (D的input是G的output concat gt file) 

update D: fix G forward G+D 


预想的是这样。。。不知道做出来成不成。。。都是玄学


-----8.27 update

和论文不同的是...

目前实现结果,是一般D网络比较强,G不行

G往往收敛到局部极值,在MINIST上的表现是28*28的全0图

我尝试了将D改弱,也不行。可能下一步就是对G做pretrain

同时参考原文的结构。xjb弄 可能确实不行。

目前代码地址:https://github.com/layumi/2016_GAN_Matlab



----8.28 update

可以看我下一篇阅读小结,这篇paper讲的是如何stable的train GAN (比如,使用batchnorm,leakyrelu等等)

但是道理我都懂,还是训不好。QAQ


- - - - - -   9.2 update

首先输入应该是100维向量,使用deconv来构成G

然后输出到一个局部极值是常见现象(我记得有一张分布的图是关于这个的)

现在在尝试improved gan这篇paper中的方法,修改G的目标函数。 可以见我最近一篇阅读小结



阅读更多
换一批

没有更多推荐了,返回首页