序章

起初,我觉得使用Keras的那些API,比如train_on_batchcompile等等,极大的减少了代码量,对刚刚入门的小白来说比较友好。

在开始接触GAN之后,发现一些关于GAN的书籍,比如GANs in action,一些关于GAN的博客,如machinelearningmasteryCSDN以及一些能搜到的视频教程,很多都是用的Keras或者tf.keras

于是我也准备学习用tf.keras来实现各种GAN

后来,经过一小段时间的学习,虽然也跟着别人的代码写出了几个能跑通的GAN,但总觉得keras的代码怪怪的。

高度封装的API,虽然容易使得小白入门,但同时也使得使用者对其内部的机制还是不怎么了解。比如之前困扰我很久的一个问题,就是关于模型的trainable参数的设置问题,明明已经设置为discriminator.trainable=False了,在后面的train_on_batch时,discriminator还能被训练。最后找到了一个不太确定的答案,详细见这篇文章:

https://fx0809.gitee.io/2020/10/12/Keras%E4%B8%AD%E5%85%B3%E4%BA%8E%E6%A8%A1%E5%9E%8B%E7%9A%84trainable%E7%8A%B6%E6%80%81%E7%9A%84%E9%97%AE%E9%A2%98/

最后,我决定采用继承自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
2
3
4
5
6
7
Note that the Dropout layer only applies when training is set to True such that no values

are dropped during inference. When using model.fit, training will be appropriately set to

True automatically, and in other contexts, you can set the kwarg explicitly to True when

calling the layer.

而在使用继承自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类的方法才导致的以上这些梯度问题,所以可以愉快的转换一下代码风格了~

至于关于这些梯度问题的解决方法,改日再聊(当我学会的时候~)。