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

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

损失函数:

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

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

其中:

训练数据x图像,

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

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

[ ]+是max(0,*)

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

 

GAN小结(BEGAN EBGAN WGAN CycleGAN conditional GAN DCGAN PGGAN VAEGAN)趋向于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相似,应该是相同

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

损失函数差别在GAN小结(BEGAN EBGAN WGAN CycleGAN conditional GAN DCGAN PGGAN VAEGAN)GAN小结(BEGAN EBGAN WGAN CycleGAN conditional GAN DCGAN PGGAN VAEGAN)

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

针对EBGAN存在问题:

当D_loss=0时,有可能是GAN小结(BEGAN EBGAN WGAN CycleGAN conditional GAN DCGAN PGGAN VAEGAN),而不是理想中的GAN小结(BEGAN EBGAN WGAN CycleGAN conditional GAN DCGAN PGGAN VAEGAN)GAN小结(BEGAN EBGAN WGAN CycleGAN conditional GAN DCGAN PGGAN VAEGAN),这样就会很麻烦

若是二者的关系为:

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

就会解决以上问题,其中由EBGAN的MSE损失计算换成WGAN中的wassertein loss,这样使得满足正态分布的图像中期望m1 m2满足如下关系:

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

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

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

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

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

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

以上是李宏毅老师课件中的PPT,在此指出了WGAN存在的问题,就是要保证D是足够平滑的,保证训练收敛,避免出现极大值、极小值。

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

 具体实现上与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之间,只在这个区域做梯度

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

5.CycleGAN

 

6.conditional GAN

 

7.DCGAN

 

8.PGGAN

 

9.VAEGAN

因为VAE变分自编码器生成的图像模糊,文中指出VAE选择element-wise度量相似性,这样的损失过于简单不适合图像数据,因此生成的图像在人眼感知上效果不佳。VAEGAN主要是引入对抗损失,证明只有像素级损失度量生成的图像效果人眼感知较差。

贡献:

将VAEs和GANs结合成一个无监督生成模型,同时学习Encoder、generate和compare三部分

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

输入一张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,加快学习过程。

具体算法流程:

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

VAEGAN是CycleGAN的一部分

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

 这两者的差别在于,把 x encode 成 z 的过程是放在生成器的前面还是后面,如果放在前面,就是 VAEGAN;如果放在后面,就是 CycleGAN。

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

写着写着我发现了一个好东西http://www.gwylab.com/note-gans.html

相关文章:

  • 2021-04-30
  • 2021-06-05
  • 2021-09-19
  • 2021-06-01
  • 2021-06-13
  • 2022-01-13
  • 2021-11-11
猜你喜欢
  • 2021-11-03
  • 2021-11-16
  • 2021-09-28
  • 2021-11-07
  • 2021-11-14
相关资源
相似解决方案