BEGAN(Boundary Equilibrium GenerativeAdversarial Networks)-pyTorch实现

前言

近期对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(Boundary Equilibrium GenerativeAdversarial Networks)-pyTorch实现_第1张图片

损失函数

BEGAN的Discriminator的结构是比较特别的,其他的GAN的Disciminator出来的往往是输入样本是否为真样本的概率,而BEGAN则引入autoencoder到d里面,D输出的是和输入一样大小的一张图片,其损失函数为输入数据 x x x和经过D(x)之后输出的图像之间按照pixelwise计算的差异作为损失函数,作者建议用L1loss。

给定网络结构和以下的迭代更新公式,即可复现原paper的论文了。
BEGAN(Boundary Equilibrium GenerativeAdversarial Networks)-pyTorch实现_第2张图片

收敛度量

BEGAN提出了一个衡量GAN训练收敛质量的测试量
M g l o b a l = L ( x ) + ( γ L ( x ) − L ( G ( z ) ) ) M_{global} = L(x) + (\gamma L(x) - L(G(z))) Mglobal=L(x)+(γL(x)L(G(z)))

实验结果

依然是64*64的人脸图像大小,不过这次数据集是在celeba的基础上用openface裁切出的人脸区域,头发帽子等背景的影响尽量降低了,也降低了GAN的难度,毕竟我只是个新手试水。

训练了大概 1 3 \frac{1}{3} 31个epoch之后生成的图像如下, 可能由于BEGAN是学习error分布,前期较长时间在较为模糊的一个状态中,DCGAN在相同训练数据的时候已经可以看到一些比较清晰的人脸了。但是BEGAN的大部分人脸还是比较模糊,只有个轮廓在,可能和损失函数是pixel-wise有关,更容易生成一些平滑的图像。样本多样性倒是还可以,64个随机样本没有看到生成一样的人脸的。
BEGAN(Boundary Equilibrium GenerativeAdversarial Networks)-pyTorch实现_第3张图片

2 3 \frac{2}{3} 32个epoch之后效果明显变好,各个人脸的五官都清晰很多,就是眼睛有点偏小的感觉,不知道我是我的觉还是训练数据集里面缺少大眼男神和女神,哈哈哈。
BEGAN(Boundary Equilibrium GenerativeAdversarial Networks)-pyTorch实现_第4张图片

训练完成一个epoch后,脸部细节基本都比较清晰了

BEGAN(Boundary Equilibrium GenerativeAdversarial Networks)-pyTorch实现_第5张图片
训练5个epoch后,眼睛也睁开了,细节更清晰逼真,看来之前训练不够,导致眼睛都像闭上一样显得小,足够训练之后,眼睛也比较清晰了,能看出眼球和神态表情了。部分图片感觉光线有点暗。不同角度性别肤色表情的人脸都有,多样性还不错。带眼镜的没有,可能不容易生成。
BEGAN(Boundary Equilibrium GenerativeAdversarial Networks)-pyTorch实现_第6张图片
gif变化图,前期模糊差异比较大,生成人脸后变化较小。

训练过程中的loss变化曲线
BEGAN(Boundary Equilibrium GenerativeAdversarial Networks)-pyTorch实现_第7张图片作者提出的convergence measure变化曲线,感觉和loss差异也不大。从中来看,网络在前期极速下降,20k次迭代后趋于收敛。
BEGAN(Boundary Equilibrium GenerativeAdversarial Networks)-pyTorch实现_第8张图片

感想

从目前一些paper来看,深度学习的一些改进还是需要很深的数学基础做铺垫,要不就只能像我一样看明白了,能实现出来但是不知道为啥这样效果会好,学习道路深远。最近也的确感觉两句话更有体会:

  1. 书读百遍其义自见。
  2. 纸上得来终觉浅,绝知此事要躬行。

浅显的道理很早就明白了,但是真实体会感觉还是不一样的,希望能慢慢变成大神。

目前GAN尝试了DCGAN和BEGAN两种方案,据说18年之后对于GAN理论上的没有太大突破,更多paper都集中于应用了,看到cycleGAN的效果感觉真酷,年后有空赶紧实现体验膜拜一下。

你可能感兴趣的:(深度学习,GAN,图像生成)