断断续续看了生成对抗网络一些日子,下面把我比较感兴趣也算是我认为效果比较好的GAN进行简单梳理,其中会参考众多前辈的文章,主要包括
1.EBGAN
原文 https://arxiv.org/pdf/1609.03126.pdf
2.BEGAN
原文:https://arxiv.org/abs/1703.10717
代码:https://github.com/carpedm20/BEGAN-tensorflow
https://github.com/Heumi/BEGAN-tensorflow
https://github.com/carpedm20/BEGAN-pytorch
3.WGAN
原文:https://arxiv.org/abs/1701.07875
代码:https://github.com/hwalsuklee/tensorflow-generative-model-collections
https://github.com/Zardinality/WGAN-tensorflow
4.WGAN-GP
原文:https://arxiv.org/abs/1704.00028
代码:https://link.zhihu.com/?target=https%3A//github.com/igul222/improved_wgan_training
https://github.com/caogang/wgan-gp
CycleGAN
conditional GAN
DCGAN
PGGAN
VAEGAN
原文:http://proceedings.mlr.press/v48/larsen16.pdf
energy-based基于能量的生成对抗网络
将判别器看成能量函数,不再判别判别器输入图像是否来自Pdata还是Pg,而是去鉴别输入图像的重构性高不高。具体来说就是,本来discriminator的目的是学会寻找Pdata与Pg之间的差异,进而给图片质量打分,现在我们不再是通过寻找差异来打分,而是用一种”强烈的记忆”让discriminator仅仅记住Pdata长什么样子,将real image经过自编码器的输入给低能量(0),将生成(假的)样本给高能量(有上限)。EBGAN就是用autoencoder实现了这样的“记忆”,我们会在接下来详细介绍。
这个结构的优点是,可以提前训练Auto-Encoder,让判别器变得很强,而不是随着生成器逐渐变好来逐渐提升判别器的能力
D是一个自编码器auto-encoder
损失函数:
其中:
训练数据x图像,
Dencoder对x编码解码后的图像是Dencoder(x)
Dencoder(G(z))是Dencoder以G的生成为输入的结果(对应上图是上一种输入)
[ ]+是max(0,*)
趋向于0,则得到图像x经过Encoder和decoder得到的图像D(E(x))与x越接近越好,即减小了real image重构损失,并得到由随机变量z经过生成器G生成的图像G(z)(fake image)经过Encoder-decoder之间差距越接近m越好,m是一个参数,重构损失大于m为0,小于m为正就是去掉m,只剩重构损失,添加m是不想让fake image非常negative,所以给定一个参数m,这样就可以把real image和G(z)区分开
网络结构和EBGAN相似,应该是相同
损失函数差别在和
针对EBGAN存在问题:
当D_loss=0时,有可能是,而不是理想中的
和
,这样就会很麻烦
若是二者的关系为:
就会解决以上问题,其中由EBGAN的MSE损失计算换成WGAN中的wassertein loss,这样使得满足正态分布的图像中期望m1 m2满足如下关系:
https://blog.csdn.net/a312863063/article/details/83573823
BEGAN博客讲解:https://blog.csdn.net/qq_25737169/article/details/77575617?locationNum=1&fps=1
解决GAN中JS散度存在的问题:
Pg与Pdata往往没有重叠,计算得到的JS散度为常数log2,没有收敛能力,采用一种Earth Mover’s Distance距离来衡量两种分布之间的关系。
具体讲解请看:https://zhuanlan.zhihu.com/p/25071913(知乎 郑华滨)
计算Earth Mover’s Distance
以上是李宏毅老师课件中的PPT,在此指出了WGAN存在的问题,就是要保证D是足够平滑的,保证训练收敛,避免出现极大值、极小值。
具体实现上与GAN差异:
(1)D中没有sigmiod函数,是linear
(2)去除log()改为D(x)
(3)需要加入梯度惩罚或是weight clipping
(4)修改G_loss
为了满足lipschitz条件,想出了相关解决方案:
其一:限制权值weight clipping,把参数w限制在[-c,c]之间
其二:根据lipschitz原理,输入改变量*k大于输出改变量,就是D(x)对所有x的梯度小于1,但是无法计算针对所有分布x的积分。
WGAN-GP 只约束Pdata和Pg之间,只在这个区域做梯度
因为VAE变分自编码器生成的图像模糊,文中指出VAE选择element-wise度量相似性,这样的损失过于简单不适合图像数据,因此生成的图像在人眼感知上效果不佳。VAEGAN主要是引入对抗损失,证明只有像素级损失度量生成的图像效果人眼感知较差。
贡献:
将VAEs和GANs结合成一个无监督生成模型,同时学习Encoder、generate和compare三部分
输入一张real image x1,通过Encoder 得到code(也就是正态分布的z),然后z输入到decoder产生图像x2,这时就是VAE网络结构,VAE是想让 x1和x2越接近越好,即loss越小越好,但是loss小不见得就清晰,像素级loss在衡量图像质量上作用不佳。
VAE+GAN,在VAEGAN中又把VAE生成的x2经过一个判别器,用判别器判断输入图像属于Pdata还是Pg,这样可以提高生成图像质量。在像素级损失的基础上引入对抗损失
GAN+VAE,加入Encoder这一模块使得Generator输入的code 更接近与real image相关的code,加快学习过程。
具体算法流程:
VAEGAN是CycleGAN的一部分
这两者的差别在于,把 x encode 成 z 的过程是放在生成器的前面还是后面,如果放在前面,就是 VAEGAN;如果放在后面,就是 CycleGAN。
写着写着我发现了一个好东西http://www.gwylab.com/note-gans.html
各类GAN整理:http://www.twistedwg.com/2018/10/05/GAN_loss_summary.html