参考tricks:
- keep calm and train GAN
- gan tricks
- 外国友人调DCGAN
- 为什么gan生成的图片模糊的讨论
- 为什么gan生成的图片模糊2
- How can GANs be evaluated?
- https://towardsdatascience.com/mangagan-8362f06b9625
github 上一些参考repo
https://github.com/pavitrakumar78/Anime-Face-GAN-Keras
首先是看了李宏毅老师的课程,然后尝试着做作业,用tensorflow来做,记录一些坑。代码在github
一开始就是尝试最原始的gan,loss也是用的最原始的loss来训练。
- 训练的时候可能会出现判别器loss快速降到0,而生成器loss不断上升的现象,这样的情况github上有人对此进行过讨论:
- 对所有discriminator的输入加上一个高斯白噪声,instance noise。
- 用soft label
- 我尝试的方法是,在每次训练迭代中计算生成器loss和判别器loss的差值,如果判别器loss大于生成器一定阈值以上,就训练判别器,其他情况训练生成器。这样是能够比较好的工作的。
'''
''' -
训练过程中,生成器生成的图片显示会慢慢接近真实图片,但随着训练的进行,慢慢又变成了随机噪声。
可能是因为我在discriminator中加了上面说的高斯白噪声。这个噪声的标准差应该随着训练而减小才对。尝试过,这样是有效的。通过观察每次训练迭代过程判别器对真实图片和生成图片的打分可以看到,到了训练后期,判别器对于真实图片的打分都到了0.8以下,这可能是后期生成器无法学习到真实分布的原因。因此在每次迭代中,训练判别器的条件不仅当判别器loss大于生成器loss超过某个阈值时,还加上当判别器对真实图片打分低于某个数值的时候。这样一来,生成器生成的图片就趋于收敛了。这种情况下,
scheme_index = ii//1000 if ii < 10000 else -1
if train_d:
real_score,fake_score,_,dLoss,gLoss = sess.run([m_real_score,m_fake_score,d_trainer,d_loss,g_loss],
feed_dict={real_image:rib, inptG:nb,
gn_stddev:stddev_scheme[scheme_index], training:True})
else:
real_score,fake_score,_,dLoss,gLoss = sess.run([m_real_score,m_fake_score,g_trainer,d_loss,g_loss],
feed_dict={real_image:rib, inptG:nb,
gn_stddev:stddev_scheme[scheme_index], training:True})
if dLoss-gLoss > switch_threshold or real_score < real_score_threshold:
train_d = True
else: train_d = False
- 记录一下,当我想把生成器的channel数改大的时候,发现loss值会变成nan,应该是过大的值。。还不清楚怎么回事,调小一点就没事,
由于最终的结果还不是特别好,尝试用优化的GAN,如WGAN,这里有个参考实现,理论也有很多参考
-
WGAN->
- WGAN-GP->
稍微好一些,作用不是特别明显,到目前为止作用最大的还是instance noise。还没有尝试soft label,之后试试,不过由于改成了WGAN,实际上已经不存在label一说了,所以soft label不知道怎么加上。
发现之前的网络结构有一些问题:
- 在Generator的输入dense层后面需要加激活
- bn置于激活层前面
- 使用lrelu代替relu
- 使用更多的channel
- 交替训练的各自次数1:1(发现generator的loss往往更高)
更改之后:3e0a9d2..0e77ea5
效果如下
由于生成的图片里有很多缺陷(artifact),所以就查了很多相关资料,其中参考4和5都是关于这个的。
在训练到一定程度的时候,换成没有加noise的输入继续训练,并且调整学习率更小,这样效果还行,关键是细节多了很多。(20190102-160705)(25af0e)
但是总是会出现坏点,于是就去查了原始数据集,发现数据集里边本身就含有很多有问题的数据, 包括根本不是头像的,奇怪的头像的以及全身的图像.占比大概在1/20左右,应该挺影响的.我一张一张的剔除了.重新训练看看(3210591),训练大概20000次左右,效果一般,然后换0.0001学习率和1:1学习,batchsize从64调到32,继续训练(5dd7b5d,20190106-090041)
由于G_loss总是比较大,所以想着把一次更新中的D和G的更新次数设置为1:5看看,结果好像生成的图片有点崩坏啊,而且loss也并没有明显的下降。可能问题还是数据集太diverse了:
还是换回了5:5训练,把lr值进一步缩小到5e-5:(20190108-094801)
感觉还是就这屎一样的效果。要崩溃了!!!
重新训练scratch,187af22(20190109-090711)调整了G的最后一层
打算改小lr进行fine tune,不过这个数据集这个网络,估计也就能train成这样了。除非把数据集进一步优化,把优质的图片筛出来