生成对抗网络_简单理解

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

首先我来说明一下对抗网络到底是一种什么样的对抗方式:

其实这个原理并不复杂,一个生成器,一个辨别器,一个负责造假一个负责打假。对于生成器G来说,G希望他伪造的样本能够瞒天过海,让辨别器区分不出伪造样本与真实样本的区别。但是对于辨别器D来说,D当然希望G伪造的样本能够被准确区分,正所谓法网恢恢疏而不漏生气。就是这样一个对抗的过程,生成器G必须不断地改进自己,道高一尺魔高一丈,辨别器D也要不断地改进自己,最后当辨别器区分不出伪造样本和真实样本地时候(纳什平衡),我们可以认为生成器已经能够生成与真实样本类似的样本了。其实这里有个难点,辨别器的好坏间接影响着生成器生成的样本质量,如果辨别器过于强大,会使得辨别器总能很好地区分样本真假从而达不到纳什平衡而导致训练失败。但是如果辨别器过于羸弱,那么过快地达到纳什平衡,这个问题就导致生成的样本质量很低。因此一个中性的辨别器对于整个训练过程以及生成样本的好坏有一定的影响。

ok,说完了“对抗”,我们再来谈一下具体怎么实现GAN。

先上一个公式,该公式就是从Goodfellow大神第一篇GAN[1]论文中截取的,大神就是不一样,写出来的东西像我这种普通人还真理解了好长一段时间哭。我想用通俗的话来解释一下这个公式,希望大佬勿喷啊。首先我们先规定一个前提,那就是辨别器D的输出是一个数,我们先把他看成是一个概率(除了WGAN[2], BEGAN[3]),表示越接近真实样本概率就越大。然后我们看内循环max D,此时对抗就已经开始了,这里有个疑问,他为什么要用max,我们先看等号右边第一项,x服从真实样本分布,其实就是真实样本,对于辨别器来说希望能够正确区分真假,即D(x)概率应该是越大越好,即第一项应该越大越好应该取最大值max。再来看第二项,z是取自某一分布的数据,D(G(z))表示生成样本接近真实样本的概率,对于辨别器来说,要真确区分他的真假当然是希望D(G(z))越小越好,由于前面添了个负号,因此第二项也应该越大越好,所以第二项也应该取最大值max,由于两项都是取max,所以整体来说也取max。

再来看外循环min G,还是同上那个疑问,为什么要用min,先看等号第一项,其实对于生成器来说第一项是可以忽略的,求梯度的时候,由于第一项对于生成器G来说相当于是一个常数,梯度为0,对结果不影响,实现的时候我们只保留第二项。等号第二项理解同上,对于生成器G来说,他希望辨别器区分不了他的真假,即希望D(G(z))概率越大越好,越大越接近真实样本,由于前面添了个负号,所以是取最小值min。

下图是Goodfellow论文GAN[1]中的算法:


这里我想提醒的是内循环只更新D的权重,要保持G不变,外循环只更新G的权重,保持D不变。

以下是用TensorFlow写的一段代码,D表示辨别器,输入是一张图片,输出是一个值。epsilon表示一个很小的值,防止log(x)发生溢出。
fake_logit = tf.nn.sigmoid(D(fake_img))
real_logit = tf.nn.sigmoid(D(real_img))
d_loss = -(tf.reduce_mean(tf.log(real_logit + epsilon)) + tf.reduce_mean(tf.log(1 - fake_logit + epsilon)))#辨别器损失
g_loss = - tf.reduce_mean(tf.log(fake_logit + epsilon))#生成器损失
opt_D = tf.train.AdamOptimizer(2e-4, beta1=0.5).minimize(d_loss, var_list=D.var)#用Adam做优化器更新辨别器参数
opt_G = tf.train.AdamOptimizer(2e-4, beta1=0.5).minimize(g_loss, var_list=G.var)#用Adam做优化器更新生成器参数

这是我用DCGAN[4]生成的假人脸的结果:


训练集是CelebA[5],batchsize设置为128,迭代8000次,由于设备原因训练速度比较慢,训练时间比较仓促,挺模糊的,很抱歉。

代码在我的GitHub个人主页能找到,找个时间传上去,希望大家多多支持微笑

Github:https://github.com/MingtaoGuo

[1]Goodfellow I J, Pouget-Abadie J, Mirza M, et al. Generative adversarial nets[C]// International Conference on Neural Information Processing Systems. MIT Press, 2014:2672-2680.

[2]Arjovsky M, Chintala S, Bottou L. Wasserstein GAN[J]. 2017.

[3]Berthelot D, Schumm T, Metz L. BEGAN: Boundary Equilibrium Generative Adversarial Networks[J]. 2017.

[4]Radford A, Metz L, Chintala S. Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks[J]. Computer Science, 2015.

[5]Liu Z, Luo P, Wang X, et al. Deep Learning Face Attributes in the Wild[C]// IEEE International Conference on Computer Vision. IEEE, 2016:3730-3738.

猜你喜欢

转载自blog.csdn.net/Geoffrey_MT/article/details/80864029