GAN及其相关模型训练细节总结

前言:

 GANs虐我千百遍,我待GANs如初恋;前段时间使用infoGAN在做实验,碰到了许多莫名其妙的问题,可见,复现了一个模型能不能train一个好的结果还是另一回事。于是我从网上整理了一些关于生成模型训练的一些细节,我再重申一些,下面的内容大部分不是来自本人的原创,侵删!

正文: 

  • 1. 更大的kernel,更多的filter

大的kernel能够覆盖更多的像素,也因此能够获得过多的信息。在CIFAR-10数据上,使用5*5的kernel能够得到很好的效果,而使用3*3的kernel会导致判别器的损失函数快速跌落至0。对于生成器,顶层更大的kernel某种程度上来说能够保证平滑,对于底层改变kernel的大小不会有什么影响。filter数目的增加将极大增加网络的参数量,通常来说,filter的数目越多越好。在上面的实验中,我使用了128个filter。当使用很少的filter时,尤其生成器包含很少的filter时,生成的图像会特别模糊。所以,更多的filter能够获取更多的信息,并最终保证生成的图像具有足够的清晰度。

  • 2. 标签翻转 (Generated=True, Real=False)

看起来,这是一个匪夷所思的操作,但事实上这个骚操作确实起了一定的作用。

  • 3. 更改样本标签

在训练判别器时,这个操作非常有用。0或者1的标签,我们称之为hard label,这种标签可能会使得判别器的损失值迅速跌落至0。所以我们使用了soft label,对于标签为0的样本,其标签设置为(0,0.1)内的随机数;而对于标签为1的样本,其标签设置为(0.9,1)内的随机数。当然,这个操作在训练生成器的时候不需要做。

在训练样本的标签上加入随机噪声,也能提升模型效果。进入判别器中5%的图像,随机地翻转其标签,即真的猫图片标记成假的,生成的猫图片标记为真的猫图片,也能够提升一些效果。

  • 4. Batch normalization

加入batch normalization能够使得生成的图像更加细腻,但当kernel和filter的数目设置不对,或者判别器的损失函数快速跌落至0时,增加BN没有什么作用。

  • 5. 一次训练一种类型的图片

为了能够让训练更加简单,有必要使得输入数据具有相似的特点。比如,使用CIFAR-10中所有10种类型的样本训练,不如挑选其中一类,比如汽车或者青蛙,训练模型专门生成这个类别的图像。当然,也有一些DC-GAN的其他变种,能够同时学习多个类别的图像。比如,Conditional GANs,以标签为输入并生成基于类别标签的图像,但是当你使用简单的DC-GAN时,最好构造一类图像数据,让训练变得简单。

  • 6. 注意训练过程中的梯度

训练过程中应关注梯度和损失值,这些信息能够帮助我们了解训练的进展情况,甚至能够帮助我们定位问题代码。理想情况下,在训练开始时,生成器产生的梯度通常比较大,而判别器的梯度不一定很大,因为开始的时候,判别器能够很容易分清真实和虚假的图片。当生成器训练到一定程度时,能够生成一些“以假乱真”的图片,这会使得判别器很难区分真实和虚假的图片,此时判别器会犯错,同时梯度也会很大。

  • 7. 不要early stopping

刚刚接触GAN的训练时,一个常见的错误:当我们发现损失值不变时,或者生成的图像一直模糊时,通常会终止训练,调整模型。这个时候我们也要注意一下,GAN的训练通常非常耗时,所以有时候多等一等会有意想不到的“收获”。值得注意的是,当判别器的损失值快速接近0时,通常生成器很难学到任何东西了,就需要及时终止训练,修改网络、重新训练。

  • 8. 噪音向量采样自标准正态分布:

假如你的输入是一张图片,将图片数值归一化到 [-1, 1];假如你的输入是一个随机噪声的向量,最好是从 N(0, 1) 的正态分布里面采样,不要从 U(0,1) 的均匀分布里采样。

  • 9. 输出层:

使用输出通道为 3 的卷积作为最后一层,可以采用 1x1 或者 3x3 的 filters,有的论文也使用 9x9 的 filters。

  • 10. 尽量使用upsample:

在做 decode 的时候,尽量使用 upsample+conv2d 组合代替 transposed_conv2d,可以减少 checkerboard 的产生。

  • 11. 判别器D:

想要生成更高清的图像,推荐 multi-stage discriminator。简单的做法就是对于输入图片,把它下采样(maxpooling)到不同 scale 的大小,输入三个不同参数但结构相同的 discriminator。

  • 12. 多次训练G少次训练D:

在优化 G 的时候,我们默认是假定我们的 D 的判别能力是比当前的 G 的生成能力要好的,这样 D 才能指导 G 朝更好的方向学习。通常的做法是先更新 D 的参数一次或者多次,然后再更新 G 的参数,TTUR 提出了一个更简单的更新策略,即分别为 D 和 G 设置不同的学习率,让 D 收敛速度更快。

转载自:

链接一​​​

链接二

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值