生成对抗网络GAN系列(一)--- Generative Adversarial Nets(原始GAN)--- 文末附代码

GAN网络系列之(一) ---  Generative Adversarial Nets

---文末附代码

论文链接:https://arxiv.org/abs/1406.2661

1.简述

作者提出了一个通过对抗过程估计生成模型的新框架,在新框架中同时训练两个模型:一个用来捕获数据分布的生成模型G,和一个用来估计样本来自训练数据而不是G的概率的判别模型DG的训练过程是最大化D产生错误的概率

 

2.核心思想

生成模型G可以被认为是一个造假团队,试图生产假币并在不被发现的情况下使用它,而判别模型类似于警察,试图查获假币。在这个游戏中的竞争驱使两个团队都在改进他们的方法(生产出的假币越来越真,警察的识别能力也越来越强),直到真假难分为止。

生成对抗网络GAN系列(一)--- Generative Adversarial Nets(原始GAN)--- 文末附代码

 3.具体实现

·为了学习生成器关于数据x上的分布pg, 我们定义输入噪声的先验变量Pz(z),然后使用G(z;θg)来代表数据空间的映射。

·这里G是一个由含有参数θg 的多层感知机表示的可微函数。也就是生成器。

·我们再定义了一个多层感知机D(x;θd)用来输出一个单独的标量。也就是判别器。

·D(x) 代表x 来自于真实数据分布而不是Pg的概率

·训练D来最大化分配正确标签给不管是来自于训练样例还是G生成的样例的概率.

 

我们同时训练G来最小化log(1−D(G(z))):

生成对抗网络GAN系列(一)--- Generative Adversarial Nets(原始GAN)--- 文末附代码

在实际的操作中:Rather than training G to minimize log(1 - D(G(z))) we can train G to maximize log D(G(z)).

因为换成这一项能够提供更强的梯度

 

算法如下:

生成对抗网络GAN系列(一)--- Generative Adversarial Nets(原始GAN)--- 文末附代码

这里要注意G网络和D网络是分开训练的,也就是训练D网络的时候,尽管会有G(z)作为输入,但是梯度不用回传进G网络,这时候把G(z)看作一个固定的输入即可。

 

理论上,这个极小化极大问题的全局最优解为Pg=Pdata

4.示例结果:

生成对抗网络GAN系列(一)--- Generative Adversarial Nets(原始GAN)--- 文末附代码

这是由输入噪音经过Generator之后生成的图像,可以看到已经很逼近mnist原始数据集了

 

5.代码

pytorch实现代码:https://github.com/TeeyoHuang/Generative-Adversarial-Nets-pytorch