前言
近期对GAN做了些了解,目前GAN除了DCGAN,还有WGAN,WGAN-GP, LSGAN, EBGAN,BEGAN这些,简单了解了下,大多数涉及到数学的,我都没看懂,WGAN从很理论的角度提出了一些改进,但是一些paper说他收敛速度还不如DCGAN,目前还没有全部仔细阅读相关paper。
BEGAN:Boundary Equilibrium GenerativeAdversarial Networks中的例子可以生成128*128大小的清晰人脸,所以打算先以BEGAN做一个简单的尝试。
之前写了一个DCGAN的tensorflow实现,这次就换pyTorch试试。目前github上很多项目都是以pyTorch写的,了解一下有利于后续阅读大神的代码。tensorflow的api的确有些臃肿,在用的时候往往不知道该用哪个api。解决办法只有唯一一种最佳实现方式这样感觉学习起来会更容易一些,不会花太多时间在了解不同方法之间的异同比较上,能更集中精力做需要学习的事,毕竟越来越觉得时间不容易把握,分心的事情太多。
所以这次参考pyTorch官方DCGAN教程改写了一个BEGAN的实现,主要目的是熟悉一下pyTorch. pyTorch的tutorial做得真不错,描述很详细清晰,每一步的原因逻辑也很清晰。
paper原理和细节
优点
贡献点如下
- 简单但鲁棒的GAN结构,快速稳定收敛
- 提出一种均衡概念来平衡discriminator和generator
- 提出一种新的方式来平衡生成图像的视觉质量和样本的多样性
- 有一个可以标示收敛性的指标,除了WGAN以外第二个有此特性的GAN.
数学相关
作为一个数学学渣,这部分没看太懂,后续看懂了的话再补充。
网络架构
网络架构比较简单,一个encoder,一个是decoder
- generator和decoder的结构一样
- dicriminator则是encoder+decoder,输入是图片,输出也是一样大小的图片
- 每个卷积层后的激活函数是ELU
损失函数
BEGAN的Discriminator的结构是比较特别的,其他的GAN的Disciminator出来的往往是输入样本是否为真样本的概率,而BEGAN则引入autoencoder到d里面,D输出的是和输入一样大小的一张图片,其损失函数为输入数据 x x x和经过D(x)之后输出的图像之间