目前在深度学习领域中,生成对抗网络是非常热门,能给我们带来不可思议的一个领域方向。今天我将分享一下如何用生成对抗网络来做生成图像(Mnist和卡通人物脸)。
一、GAN是如何诞生的
学术界流传,GAN创始人 Ian Goodfellow 在酒吧微醉后与同事讨论学术问题,当时灵光乍现提出了GAN初步的想法,不过当时并没有得到同事的认可,在从酒吧回去后发现女朋友已经睡了,于是自己熬夜写了代码,发现还真有效果,于是经过一番研究后,GAN就诞生了。(https://blog.csdn.net/qq_25737169/article/details/78857724)
二、GAN的原理
《Generative Adversarial Networks》是生成对抗网络的开篇之作,作者是Ian Goodfellow,在2014年发表的(https://arxiv.org/abs/1406.2661)。在这篇论文中,Ian Goodfellow仅用一段话就说完了GAN。
简单的说GAN就是以下三点:
(1)、构建两个网络,一个G生成网络,一个D区分网络。两个网络的网络结构随意就好。
(2)、训练方式。G网络的loss是:log(1-D(G(z))),而D的loss是:-(log(D(x))+log(1-D(G(z)))),注意这里并不是我们常用的交叉熵函数。
(3)、数据输入。G网络的输入是noise。而D的输入则是混合了G的输出数据及样本数据。
Goodfellow 等人提出来的 GAN 是对抗过程估计生成模型的新框架。在这种框架下,需要同时训练两个模型,即一个能捕获数据分布的生成模型 G 和一个能估计数据来源于真实样本概率的判别模型 D。生成器 G 的训练过程就是最大化判别器犯错误的概率,即判别器误以为数据是真实样本而不是生成器生成的假样本。而判别器D的训练过程就是能将真实样本和生成器生成的假样本最大化分开。因此,这一框架就对应于两个参与者的极小极大博弈(minimax game)。在所有可能的函数 G 和 D 中,可以求出唯一均衡解,即 G 可以生成与训练样本相同的分布,而 D 判断的概率处处为 1/2。
三、用tensorflow实现GAN
我已经用tensorflow实现了初始版本的GAN和Wasserstein GAN(这是GAN的改进版本,初始版本GAN训练的时候非常不稳定很难训练,WGAN训练的时候比较稳定,很快就能收敛看到以假乱真的生成图像)。
四、生成图像效果
我分别在Mnist上和卡通人脸上进行了训练测试,效果如下。
第0次迭代结果:
第50次迭代结果:
第1000次迭代结果:
第10000次迭代结果:
第5000次迭代结果:
第0次迭代结果:
第50次迭代结果:
第500次迭代结果:
第10000次迭代结果:
第49999次迭代结果:
从上面效果可以看到,随着网络不断地训练迭代,生成的图像已经跟真实的图像非常相似了,足以达到以假乱真的效果。接下来我会进一步去研究如何将生成对抗网络模型应用到医学影像上来。
为了方便大家快速学习GAN,我把相应的训练数据和模型分享到了百度云盘上:https://pan.baidu.com/s/1SQZTuThtMSJvS8G2TGRBGg 密码:hfwz
相应代码地址:https://github.com/junqiangchen/GAN。
感兴趣的朋友可以在github上看到详细的过程,如果大家觉得这个项目还不错,希望大家给个Star并Fork,可以让更多的人学习。如果碰到任何问题,随时留言,我会尽量去回答的。