GAN小结(BEGAN EBGAN WGAN CycleGAN conditional GAN DCGAN PGGAN VAEGAN)

断断续续看了生成对抗网络一些日子,下面把我比较感兴趣也算是我认为效果比较好的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

 

1.EBGAN

energy-based基于能量的生成对抗网络

将判别器看成能量函数,不再判别判别器输入图像是否来自Pdata还是Pg,而是去鉴别输入图像的重构性高不高。具体来说就是,本来discriminator的目的是学会寻找Pdata与Pg之间的差异,进而给图片质量打分,现在我们不再是通过寻找差异来打分,而是用一种”强烈的记忆”让discriminator仅仅记住Pdata长什么样子,将real image经过自编码器的输入给低能量(0),将生成(假的)样本给高能量(有上限)。EBGAN就是用autoencoder实现了这样的“记忆”,我们会在接下来详细介绍。
 

这个结构的优点是,可以提前训练Auto-Encoder,让判别器变得很强,而不是随着生成器逐渐变好来逐渐提升判别器的能力

D是一个自编码器auto-encoder

损失函数:

f_{D}(x,z)=\left \|Dencoder(Encoder(x)) -x \right \|+[m-\left \| Dencoder(Encoder(G(z)))-G(z) \right \|]^{+}

f_{G}(x,z)=\left \|Dencoder(G(z)) \right \|=\left \| Dencoder(Encoder(G(z)))-G(z) \right \|]

其中:

训练数据x图像,

Dencoder对x编码解码后的图像是Dencoder(x)

Dencoder(G(z))是Dencoder以G的生成为输入的结果(对应上图是上一种输入)

[ ]+是max(0,*)

 

\left \|Dencoder(Encoder(x)) -x \right \|-\left \| Dencoder(Encoder(G(z)))-G(z) \right \|趋向于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)区分开

2.BEGAN

网络结构和EBGAN相似,应该是相同

损失函数差别在k_{t}\gamma

针对EBGAN存在问题:

当D_loss=0时,有可能是\left \|Dencoder(Encoder(x)) -x \right \|=\left \| Dencoder(Encoder(G(z)))-G(z) \right \|,而不是理想中的Dencoder(Encoder(x)) =xDencoder(Encoder(G(z)))=G(z),这样就会很麻烦

若是二者的关系为:

就会解决以上问题,其中由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

3.WGAN

解决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

4.WGAN-GP

为了满足lipschitz条件,想出了相关解决方案:

其一:限制权值weight clipping,把参数w限制在[-c,c]之间 

其二:根据lipschitz原理,输入改变量*k大于输出改变量,就是D(x)对所有x的梯度小于1,但是无法计算针对所有分布x的积分。

WGAN-GP 只约束Pdata和Pg之间,只在这个区域做梯度

5.CycleGAN

 

6.conditional GAN

 

7.DCGAN

 

8.PGGAN

 

9.VAEGAN

因为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

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值