这是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的目标函数。 可以见我最近一篇阅读小结