今天自己搭建了一个GAN,网络是自己随意搭建的,用的Pytorch框架。目的是输入一张图像,使其能够产生梵高风格的该图像。该项目来自于kaggle里的一个新手学习小项目。
整个过程中遇到过一些问题,比如:
1.对卷积的运算要准确,可以在网络的代码里的main()函数中写一个随机初始化数据来判断自己的计算是否有问题。
2.训练代码要先计算判别器的损失,再梯度下降。然后再计算生成器的。其中在训练的时候遇到了一个流程图的问题:
RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time
解决办法是在所有的loss.backfard()中加入参数retain_graph = True
3.训练时,发现初始或者过一小段时间生成器的loss很高,并且判别器的loss下降很快,并且最后趋于0.0几,通过分析,应该是生成器的能力远远小于了判别器的能力。就类似于一个从未画画过的新手模仿梵高的画,然后送给梵高本人去鉴定一样。有了这个经验后,我增加了生成器的规模,降低了判别器的规模。虽然训练到后期还是会发生判别器越来越准确的情况,但也需要训练很长一段时间才会出现这种情况,就像前期一直在不断地对抗,但最后还是判别器赢得这场比赛。GAN的核心一定要是生成器和判别器达到一种纳什平衡才行。
由于本人所用设备的限制(老笔记本了,960的GPU),所以无法再提升生成器的规模,否则可能训练时间过长,更不用说去复现已有的优秀GAN的网络代码了,过段时间等实验室的服务器可以使用了,再继续这方面的研究学习吧。