Skip to content

学术界流传,GAN创始人 Ian Goodfellow 在酒吧微醉后与同事讨论学术问题,当时灵光乍现提出了GAN初步的想法,不过当时并没有得到同事的认可,在从酒吧回去后发现女朋友已经睡了,于是自己熬夜写了代码,发现还真有效果,于是经过一番研究后,GAN就诞生了,一篇开山之作。

HaijunMa/GAN

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GAN初学习

引入的第一篇paper是Ian Goodfellow大牛的Generative Adversarial Networks (Generative Adversarial Networks),这篇paper算是这个领域的开山之作、鼻祖。

最新的一篇paper:https://arxiv.org/abs/1701.00160

Alec Radford、Luke Metz和Soumith Chintala等人的论文,介绍了本教程中我们在生成器上使用的复杂GANs的基本结构:Paper:https://arxiv.org/abs/1511.06434

     生成对抗网络采用`` __无监督学习__``的方式,自动从源数据中进行学习,在不需要人工对数据集进行标记的情况下
 就可以产生令人惊叹的结果。从维基百科的词条学习专业知识,然后写出一个令普通人可以理解的科普文章,模仿知名画家
 的作品并学习他们的风格进行再创作,这种看似只有人类这样拥有智能和创造性的物种才会做的事情,机器学习现在真的可
 以做到了! 

GAN的原理介绍:

GAN的思想是是一种二人零和博弈思想(two-player game),博弈双方的利益之和是一个常数,比如两个人掰手腕,假设总的空 间是一定的,你的力气大一点,那你就得到的空间多一点,相应的我的空间就少一点,相反我力气大我就得到的多一点,但有一点是 确定的就是,我两的总空间是一定的,这就是二人博弈,但是呢总利益是一定的。

引申到GAN里面就是可以看成,GAN中有两个这样的博弈者,一个人名字是生成模型(G),另一个人名字是判别模型(D)。他们各自有各自的功能。

相同点是:

● 这两个模型都可以看成是一个黑匣子,接受输入然后有一个输出,类似一个函数,一个输入输出映射。

不同点是:

● 生成模型功能:比作是一个样本生成器,输入一个噪声/样本,然后把它包装成一个逼真的样本,也就是输出。

● 判别模型:比作一个二分类器(如同0-1分类器),来判断输入的样本是真是假。(就是输出值大于0.5还是小于0.5);  

NEXT:

首先判别模型,就是图中右半部分的网络,直观来看就是一个简单的神经网络结构,输入就是一副图像, 输出就是一个概率值,用于判断真假使用(概率值大于0.5那就是真,小于0.5那就是假),真假也不过是 人们定义的概率而已。其次是生成模型,生成模型要做什么呢,同样也可以看成是一个神经网络模型,输 入是一组随机数Z,输出是一个图像,不再是一个数值而已。从图中可以看到,会存在两个数据集,一个是 真实数据集,这好说,另一个是假的数据集,那这个数据集就是有生成网络造出来的数据集。好了根据这个 图我们再来理解一下GAN的目标是要干什么:

判别网络的目的:

    就是能判别出来属于的一张图它是来自真实样本集还是假样本集。假如输入的是真样本,网络输出就接近1,输入的是假样本,  
网络输出接近0,那么很完美,达到了很好判别的目的。

生成网络的目的:

     生成网络是造样本的,它的目的就是使得自己造样本的能力尽可能强,强到什么程度呢,你判别网络没法判断我是真样本还
 是假样本。

     有了这个理解我们再来看看为什么叫做对抗网络了。判别网络说,我很强,来一个样本我就知道它是来自真样本集还是假样
 本集。生成网络就不服了,说我也很强,我生成一个假样本,虽然我生成网络知道是假的,但是你判别网络不知道呀,我包装的
 非常逼真,以至于判别网络无法判断真假,那么用输出数值来解释就是,生成网络生成的假样本进去了判别网络以后,判别网络
 给出的结果是一个接近0.5的值,极限情况就是0.5,也就是说判别不出来了,这就是纳什平衡了。

     由这个分析可以发现,生成网络与判别网络的目的正好是相反的,一个说我能判别的好,一个说我让你判别不好。所以叫做
 对抗,叫做博弈。那么最后的结果到底是谁赢呢?这就要归结到设计者,也就是我们希望谁赢了。作为设计者的我们,我们的目
 的是要得到以假乱真的样本,那么很自然的我们希望生成样本赢了,也就是希望生成样本很真,判别网络能力不足以区分真假样
 本位置。 

GAN模型:

GAN,即生成对抗网络,主要包含两个模块:

生成器(Generative Model)

判别器(Discriminative Model)

      生成模型和判别模型之间互相博弈、学习产生相当好的输出。以图片为例,生成器的主要任务是学习真实图片集,从而使得自己
  生成的图片更接近于真实图片,以“骗过”判别器。而判别器的主要任务是找出出生成器生成的图片,区分其与真实图片的不同,进行
  真假判别。在整个迭代过程中,生成器不断努力让生成的图片越来越像真的,而判别器不断努力识别出图片的真假。这类似生成器与
  判别器之间的博弈,随着反复迭代,最终二者达到了平衡:生成器生成的图片非常接近于真实图片,而判别器已经很难识别出真假图
  片的不同了。其表现是对于真假图片,判别器的概率输出都接近 0.5。
      这样我们的目的就达成了:我们得到了一个生成式的模型G,它可以用来生成图片。GAN 基本模型由 输入 Vector、G 网络、D网
  络组成。其中,G 和 D 一般都是由神经网络组成。G 的输出是一幅图片,只不过是以全连接形式。G 的输出是 D 的输入,D 的输入还
  包含真实样本集。这样, D 对真实样本尽量输出 score 高一些,对 G 产生的样本尽量输出 score 低一些。每次循环迭代,G 网络
  不断优化网络参数,使 D无法区分真假;而 D 网络也在不断优化网络参数,提高辨识度,让真假样本的 score 有差距。最终,经过多
  次训练迭代,GAN 模型建立。
      最终的 GAN 模型中,G 生成的样本以假乱真,D 输出的 score 接近 0.5,即表示真假样本难以区分,训练成功。
      这里,重点要讲解一下输入 vector。输入向量是用来做什么的呢?其实,输入 vector 中的每一维度都可以代表输出图片的某个
  特征。比如说,输入 vector 的第一个维度数值大小可以调节生成图片的头发颜色,数值大一些是红色,数值小一些是黑色;输入 vector
  的第二个维度数值大小可以调节生成图片的肤色;输入 vector 的第三个维度数值大小可以调节生成图片的表情情绪,等等。
      GAN 的强大之处也正是在于此,通过调节输入 vector,就可以生成具有不同特征的图片。而这些生成的图片不是真实样本集里有的,
  而是即合理而又没有见过的图片。是不是很有意思呢?下面这张图反映的是不同的 vector 生成不同的图片。

(3)GAN算法原理:

   GAN 的算法原理:既然有两个模块:G 和 D,每个模块都有相应的网络参数。先来看 D 模块,它的目标是让
   真实样本 score 越大越好,让 G 产生的样本 score 越小越好。那么可以得到 D 的损失函数为:   

image

   其中,x 是真实样本,G(z) 是 G 生成样本。我们希望 D(x) 越大越好,D(G(z)) 越小越好,也就是希望 -D(x) 越小越好,
   -log(1-D(G(z))) 越小越好。从损失函数的角度来说,能够得到上式。
   再来看 G 模块,它的目标就是希望其生成的模型能够在 D 中得到越高的分数越好。那么可以得到 G 的损失函数。
   知道了损失函数之后,接下来就可以使用各种优化算法来训练模型了。

(4)GAN模型实例

基于PyTorch 实现一个简单的 GAN 模型。仍然以绘画创作为例,假设我们要创造如下“名画”(以正弦图形为例):

demo图片

  • 迭代500次输出结果:

image

  • 迭代1000次输出结果:

image

demo安装环境

  • 环境:win10 + Anaconda + pycharm

  • 安装的库:pytorch、numpy、matplotlib

下载

      git clone https://github.com/HaijunMa/GAN.git

(5)GAN的应用

  • 利用CycleGAN进行图像转换(将苹果变成橘子;将马变成斑马)以及利用CGAN进行图像编辑。

  • 利用StackGAN自动从文本中制作逼真的图像。利用DiscoGAN进行图像风格的转换。

  • 利用SRGAN通过预训练模型提升图像品质,制作高清晰度的图像。

  • 通过特征生成逼真图像 :设想一个强盗闯入你的公寓,而你并没有他的照片,现在警察局 的系统可以根据你的描述生成强盗的照片并在数据库中进行搜索。

About

学术界流传,GAN创始人 Ian Goodfellow 在酒吧微醉后与同事讨论学术问题,当时灵光乍现提出了GAN初步的想法,不过当时并没有得到同事的认可,在从酒吧回去后发现女朋友已经睡了,于是自己熬夜写了代码,发现还真有效果,于是经过一番研究后,GAN就诞生了,一篇开山之作。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages