这里的代码都是,参考网上其他的博文学习的,今天是我第一次学习GAN,心情难免有些激动,想着赶快跑一个生成MNIST数字图像的来瞅瞅效果,看看GAN的神奇。
参考博文是如下三个:
https://www.jb51.net/article/178171.htm
代码不是原创,只是学习和看明白了。能让我们很直观看到GAN是如何训练的,以及产生的效果。
一:实例一
导入必要的包,以及定义一些图像处理的函数,比如展示图像的函数,加载MNIST数据集,并且将数据集转变成成128批量大小的批次,这个加载数据集和转换批次的操作是之前我做其他BP,CNN网络练习的时候见到过的,再次强调一下:MNIST数据加再进来后默认就是[1, 28, 28]的维度,需要变成784维度向量的话得后续自己view函数处理。
定义判别网络,这一步其实就是构造一个数字识别网络,只不过略微有些区别,这里不是识别具体的数字,而是识别是不是真实的图片,输出只有两个(0或者1),1代表是真实的图片,0代表的是构造的虚假图片。输出其实是个概率值。
构造生成网络。看似是跟判别网络很类似,其实这里的结构可以任意自行变换,输入是一个100维度的向量,向量值都是随机产生的随机数。最后生了一个784维度的图像数据,这个理的数据将会别送到判别网络中去做判别。
定义损失函数和优化器,这里优化器采用了Adam优化器,损失函数采用了二分类的交叉熵损失函数
定义两个函数,分别计算判别网络和生成网络的代价估算,对于判别网络来说,希望真实的图片预测都是输出1,期望标签是1,对于假的图片希望都是模型输出0,期望标签是0。
而对于生成网络来说,希望模型输出是1,因此期望标签是1。
定义训练流程函数
开始进行训练
代码清晰明了,对于初学者跑出一个GAN很有直观上的印象,以及怎么训练GAN也有很清晰的认识。
看看几个效果图:
总体趋势是随着迭代次数的增加,图像会变得稍微清晰一点点,数字的轮廓也明显一些。
图像十分不清晰,只能看到大概的样子,但是起码也有了数字的大致轮廓了,如果加上去雾处理的话可能效果会再好一些。
二:实例二
实例一用的是BP全连接网络结构,其他的都不动,我们把判别网络和生成网络的模型改成CNN卷积的模型,如下:
效果确实比BP网络的要好多了,生成的图像更加清晰。
来看下效果变化:
总体上看,图像更加清晰,对着迭代次数的增加,图像越清晰。