之前看过优达学城的一个深度学习的课程,主讲是个youtube上的印度网红,做了一个GAN生成人脸的简单项目(但是训练的是28*28的人脸),这次掏出来再看完paper之后,再重新试水训练一下 64 × 64 64\times64 64×64的人脸。算是正式开始学习深度学习和tensorflow的一个项目,毕竟明年可能要在实际项目中应用了。
GAN生成模型
GAN是Ian Goodfellow 在14年在Generative Adversarial Nets中提出的一种生成模型。这种模型总共有两个完全不同的网络构成,一个generator和一个discriminator, 通过对抗训练,得到了很神奇的效果,目前是深度学习领域非常火的一种网络。 generator的任务是生成假样本去欺骗discriminator,而discriminator的任务则是从真假样本中区分出假样本,两个网络相互对抗训练。当训练到最优情况下, generator生成的样本就像从真样本中获取的一样,discriminator对于任意样本都是以0.5的概率输出真或假。
虽然GAN获得了非常神奇的效果,但是也依然村一些未解决的问题
- 难以训练,难以把握discriminator和generator之间的平衡,discriminator往往很容易快速收敛,导致generator无法进一步得到更新
- mode collapse, 即训练得到的模型只输出部分学习样本,导致输出样本多样性过低。
- loss无法反应当前训练模型的好坏,没有好的指标,WGAN提出了一个指标,但是这次只实验DCGAN.
对于训练数据用 x x x表示, 其分布为 p x p_x px, D ( x ) D(x) D(x)则是discriminator,需要区分出真样本。样本来自真实样本的概率越高,则 D ( x ) D(x) D(x)越大。
z z z为一个低维的均匀分布或者高斯分布, G ( x ) G(x) G(x)是generator,它将 z z z的分布变换为真实数据的分布来欺骗 D D D。
损失函数
网络的loss function如下
m i n G m a x D V ( D , G ) = E x ∼ p d a t a ( x ) [ l o g D ( x ) ] + E z ∼ p z ( z ) [ l o g ( 1 − D ( G ( z ) ) ) ] \mathop{min}_G\mathop{max}_DV(D,G)=E_{x∼p_{data}(x)}[logD(x)]+E_{z∼p_z(z)}[log(1−D(G(z)))] minGmaxDV(D,G)=E