背景介绍
GAN(Generative Adversarial Networks, 生成式对抗网络):是GAN类型网络的初代版本,据说是Ian Goodfellow在2014年喝了一杯啤酒之后,在梦中产生的想法,我不禁感叹,大佬就是大佬啊,虽然现在这是最简单的生成式对抗网络模型,其效果也被很多模型超越,但是它的思想值得我们学习。
GAN特点
只采用了全连接层和ReLU激活函数,没有使用卷积层对图像进行处理。
生成器的输出使用tanh,产生[-1, 1]的图像,判别器的输出使用sigmoid,产生真或者假的逻辑值。
GAN图像分析
TensorFlow2.0实现
1 | import os |
模型运行结果
小技巧
- 图像输入可以先将其归一化到0-1之间或者-1-1之间,因为网络的参数一般都比较小,所以归一化后计算方便,收敛较快。
- 注意其中的一些维度变换和numpy,tensorflow常用操作,否则在阅读代码时可能会产生一些困难。
- 可以设置一些权重的保存方式,学习率的下降方式和早停方式。
- GAN对于网络结构,优化器参数,网络层的一些超参数都是非常敏感的,效果不好不容易发现原因,这可能需要较多的工程实践经验。
- 先创建判别器,然后进行compile,这样判别器就固定了,然后创建生成器时,不要训练判别器,需要将判别器的trainable改成False,此时不会影响之前固定的判别器,这个可以通过模型的_collection_collected_trainable_weights属性查看,如果该属性为空,则模型不训练,否则模型可以训练,compile之后,该属性固定,无论后面如何修改trainable,只要不重新compile,都不影响训练。
- 因为全都是全连接层,GAN适用于小目标的生成,如果是一个512x512x3的图像的生成,使用全连接层,那么就需要786432个神经元,上一层的神经元数目应该更多,设为1048576个,那么这两层之间全连接的参数量为八千多亿个,这是非常不现实的,而且效果也会特别差。
GAN小结
GAN是一种非常简单的生成式对抗网络,从上图可以看出GAN模型的参数量只有2M,虽然现在GAN网络不是最好的生成式对抗网络,但是其网络对抗思想,对后面的深度学习网络的发展有重要的影响。