GAN图像生成
生成对抗网络中是为了让我们生成的东西向期望的那样,就是为了让生成的东西很像,真的,例如用它来画画。就是描述整个网络的逻辑和目的,它有两部分组成,一个是生成器,一个是辨别器。他希望的是辨别器,它能够真正的辨别真实的图片和训练的假图片。而生成器就可以生成一个很逼真的图片,就像上面4个图一样。越到右边生成的图片就和假的图片。的分布是比较重合的。
首先下载数据。
一些数据的预处理,把图片文件分离出来。我们要的就是这个图片文件。
训练数据中的每一张图都打印出来看一下,可以看到是一些手写的数字。
image.squeeze()不需要的维度。批处理的大小就把它不要了。
简化了的生成器的网络结构。
这个是简化了的辨别器的网络结构。
把他们的各自的优化器都改个名,因为他们是两个网络,所以有两个优化器。
设定一些在训练过程中会要用到的目录来保存模型。
两个网络自然都有向前传播的方法。向前传播是为了得到损失。所以各自得到损失的目的是不一样的,生成器想要得到的损失是为了减少这个损失,而生成器的目的就是令到判别器认为他所生成出来的图片都是真的图片。判别器的目的是为了能够把真的全都区分成真的图片,把假的图片全都区分为假的图片。真的图片是一,假的图片是零。
这个是生成器的向前传播。他和他所要得到的损失值。
这个就是判别器所要进行的向前传播和他要得到的损失值是这两个损失值的和两个损失值,一个是对于真的东西的嗯,一个是对假的东西的判定。反正总共的损失值他都是希望最低,也就是他对于真的损失的判定。错的很少,对假的损失的判定错的也很少。
然后开始优化了。优化器就有两个,因为我有两个网络嘛,一个生成器,一个判别器。
写一些函数代码,可以在训练多少步的时候输出一下?生成器所生成的图片质量已经有多好了。比方说我们肯定知道去越到后面他的网络肯定越强,所以训练出来。的时候,它所生成的图片就越像是真的,那么越在前面早期的时候,它所生产出来的图片就越不像我们的目标图片。就会显得很稚嫩。
这里就是每隔10步就打印一下损失,看一下损失的值有没有下降。
初始的时候都是给个噪声让他开始。
可以看到在训练的过程中,判别器和生成器它的损失。都在一定程度的变化,可以看到的是判别器的损失下降的不是很明显,生成器的损失下降会多一点,因为最终我们所要用到的模型实际上就是这个生成器的模型,让他帮我们生成更加逼真的图片。
然后可以把在训练过程中所得到的模型所生成的假图片进行一个合成动画就可以看到他在训练的过程,随着训练的时间越来越长。他所生成的图片就越像是真的。