对前面三篇文章的总结
序章
起初,我觉得使用Keras
的那些API
,比如train_on_batch
,compile
等等,极大的减少了代码量,对刚刚入门的小白来说比较友好。
在开始接触GAN
之后,发现一些关于GAN
的书籍,比如GANs in action
,一些关于GAN
的博客,如machinelearningmastery
,CSDN
以及一些能搜到的视频教程,很多都是用的Keras
或者tf.keras
于是我也准备学习用tf.keras
来实现各种GAN
。
后来,经过一小段时间的学习,虽然也跟着别人的代码写出了几个能跑通的GAN
,但总觉得keras
的代码怪怪的。
高度封装的API
,虽然容易使得小白入门,但同时也使得使用者对其内部的机制还是不怎么了解。比如之前困扰我很久的一个问题,就是关于模型的trainable
参数的设置问题,明明已经设置为discriminator.trainable=False
了,在后面的train_on_batch
时,discriminator
还能被训练。最后找到了一个不太确定的答案,详细见这篇文章:
最后,我决定采用继承自tf.keras.Model
的方式编写代码,这也与PyTorch
的风格相近,便于之后快速上手PyTorch
。
DCGAN V2.0 && WARNING:tensorflow:Gradients do not exist for variables
文章传送门:
https://fx0809.gitee.io/2020/10/15/DCGAN-V2-0/
https://fx0809.gitee.io/2020/10/15/warning-tensorflow-Grandients-do-not-exist/
在使用Keras
风格编码时,Dropout
层的training
参数会自动被设置为True
官网是这样解释的:
1 | Note that the Dropout layer only applies when training is set to True such that no values |
而在使用继承自tf.keras.Model
类的编码风格时,需要手动调整该参数
至于是调成True
还是False
,都是可以的
但当不明显的设置training=True
时,对于本模型而言,出现了梯度爆炸或消失的问题
而当设置training=True
后,模型可以正常训练
以上就是一个调参的过程
加不加Dropout
层,加了之后的参数如何设置等等,都是一个调参的过程。
SGAN
文章传送门:
https://fx0809.gitee.io/2020/10/15/SGAN/
在训练SGAN的时候,也出现了梯度消失或者爆炸的情况:
若去掉Dropout
层,则生成的图片千篇一律,怀疑是梯度消失(梯度消失,从而无法更新权重,导致生成的图片一个样?)
若加上Dropout
层,则生成的图片时好时坏,不稳定!
ALL IN ALL
并不是因为我把Keras
风格的代码改为继承自tf.keras.Model
类的方法才导致的以上这些梯度问题,所以可以愉快的转换一下代码风格了~
至于关于这些梯度问题的解决方法,改日再聊(当我学会的时候~)。