目的:利用真实数据,生成数据--以假乱真

判别模型,直观来看就是一个简单的神经网络结构,输入是一副图像,输出是一个概率值,用于判断真假使用(概率值大于0.5那就是真,小于0.5那就是假),真假也不过是人们定义的概率而已。

生成模型,看成是一个神经网络模型,输入是一组随机数Z,输出是一个图像,不再是一个数值而已。从图中可以看到,会存在两个数据集,一个是真实数据集,另一个是假的数据【生成网络造出来的数据集】。

GAN的目标是要干什么:

  • 判别网络的目的:就是能判别出来属于的一张图它是来自真实样本集还是假样本集。

    • 输入真样本,网络输出就接近1;

    • 输入假样本,网络输出接近0

  • 生成网络的目的:生成网络是造样本的

    • 目的就是使得自己造样本的能力尽可能强,判别网络没法判断我是真样本还是假样本。

 

判别网络,判别一个样本来自真样本集还是假样本集。

生成网络生成的假样本,判别网络无法判断真假,判别网络给出的结果是一个接近0.5的值,极限情况就是0.5,也就是说判别不出来了,这就是纳什平衡了。

生成网络与判别网络的目的正好是相反的,一个说我能判别的好,一个说我让你判别不好。所以叫做对抗,叫做博弈。

 

 

GAN--对抗生成网络

 

训练方法:单独交替迭代训练

  • 重新计算假样本(假样本每次是需要更新的,产生越来越像的样本)

  • 训练D网络,一个二分类的神经网络;【判别网络trainable,将输入真实数据-1和噪声数据-0输入判别网络,训练判别网络】

  • 训练G网络,一个串联起来的长网络,也是一个二分类的神经网络(不过只有假样本来训练),同时D部分参数在下一次的时候不能变了。【串接G-D网络,判别网络trainbable=false,只有假样本-1,优化G网络】

目标公式

GAN--对抗生成网络

优化D:

GAN--对抗生成网络

优化D的时候,也就是判别网络,其实没有生成网络什么事,后面的G(z)这里就相当于已经得到的假样本。优化D的公式的第一项,使的真样本x输入的时候,得到的结果越大越好,可以理解,因为需要真样本的预测结果越接近于1越好嘛。对于假样本,需要优化是的其结果越小越好,也就是D(G(z))越小越好,因为它的标签为0。但是呢第一项是越大,第二项是越小,这不矛盾了,所以呢把第二项改成1-D(G(z)),这样就是越大越好,两者合起来就是越大越好。

优化G:

GAN--对抗生成网络

优化G的时候,这个时候没有真样本什么事,所以把第一项直接却掉了。这个时候只有假样本,但是我们说这个时候是希望假样本的标签是1的,所以是D(G(z))越大越好,但是呢为了统一成1-D(G(z))的形式,那么只能是最小化1-D(G(z)),本质上没有区别,只是为了形式的统一。之后这两个优化模型可以合并起来写,就变成了最开始的那个最大最小目标函数了。

损失函数分析

[[判别模型损失小,意味着更容易区分真实图像和假图像--因为真假标签为1-0;相反,此时的生成模型与它的目标(真实图像)相差很大,损失函数会增大。反之亦然。

最终理想的生成器的损失函数应该和判别器的损失函数一样大,这时判别器无法区分真实图像和假图像,生成器也达到了它所能到达的最小损失值。]

keras-github程序--见参考文献-2

https://blog.csdn.net/qq_28168421/article/details/80993864

https://www.jianshu.com/p/f1485a7deb47

GAN训练问题

  • 网络存在着不收敛问题;网络不稳定;网络难训练;GAN刚出来的时候,很多人也在致力于解决这些问题,当你实验自己碰到的时候,还是很有意思的。举个例子,可能某一次你会发现训练的误差很小,在下一代训练时,马上又出现极限性的上升的很厉害,过几代又发现训练误差很小,震荡太严重。

  • 其次网络需要调才能出像样的结果。交替迭代次数的不同结果也不一样。比如每一代训练中,D网络训练2回,G网络训练一回,结果就不一样

  • 这是简单的无条件GAN,所以每一代训练完后,只能出现一个结果,那就是0-9中的某一个数。要想在一代训练中出现好几种结果,就需要使用到条件GAN了。

GAN--图像生成--后续研究

GAN-三个问题

LSGAN--损失函数由交叉熵函数变为最小二乘loss

GAN--对抗生成网络