深度学习GAN(一)之简单介绍
深度学习GAN(二)之基于CIFAR10数据集的例子
深度学习GAN(三)之基于手写体Mnist数据集的例子
深度学习GAN(四)之PIX2PIX GAN的例子
生成式对抗网络(GAN, Generative Adversarial Networks )是Ian Goodfellow及其同事在2014年设计的一类机器学习框架。是近年来复杂分布上无监督学习最具前景的方法之一。模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为 G 和 D 。一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。
在给定训练集的情况下,该技术将学习生成具有与训练集相同的统计数据的新数据。例如,受过照片训练的GAN可以生成新照片,这些新照片至少对人类观察者而言表面上看起来真实,具有许多现实特征。尽管GAN最初是作为无监督学习的生成模型的一种形式提出的,但它也被证明对半监督学习,完全监督学习,和强化学习有用。
GAN的核心思想是基于鉴别器的“间接”训练,该鉴别器本身也在动态更新。基本上,这意味着不训练生成器以最小化到特定图像的距离,而是使鉴别器蒙骗。这使模型能够以无监督的方式学习。
在训练过程中,生成器努力地让生成的图像更加真实,而判别器则努力地去识别出图像的真假,这个过程相当与一个二人博弈,随着时间的推移,生成器和判别器在不断地进行对抗。
下图是GAN的整个结构的图片
原始的GAN是Ian Goodfellow及其同事在2014年设计的一类机器学习框架。
DCGAN的作者专注于改进原始简单的GAN的架构。我想他们不得不花很长时间尝试很多参数!
DCGAN 的判别器和生成器都使用了卷积神经网络(CNN)来替代GAN 中的多层感知机,同时为了使整个网络可微,拿掉了CNN 中的池化层,另外将全连接层以全局池化层替代以减轻计算量。
DCGAN 相比于GAN 或者是普通CNN 的改进包含以下几个方面:
(1)使用卷积和去卷积代替池化层
(2)在生成器和判别器中都添加了批量归一化操作
(3)去掉了全连接层,使用全局池化层替代
(4)生成器的输出层使用Tanh **函数,其他层使用RELU
(5)判别器的所有层都是用LeakyReLU **函数
这些是使用额外标签信息的GAN。这样可以获得更高质量的图像,并且能够在一定程度上控制生成的图像的外观。
条件GAN是GAN框架的扩展。这里我们有条件信息Y描述数据的某些方面。例如,如果我们处理人脸,Y可以描述头发颜色或性别等属性。然后,将该属性信息插入到生成器和判别器中。
条件GAN很有意思,原因有两个:
MNIST样本中Z和Y之间的差异。Z固定在行上,Y固定在列上。Z编码数字的样式,Y编码数字本身。
能够以无人监督的方式在噪声向量Z的一部分中编码有意义的图像特征的GAN。例如,编码数字的旋转。
你有没有想过输入噪声Z在GAN中编码的信息是什么?它通常以充满噪音的方式编码图像的不同类型的特征。例如,您可以获取Z向量的一个位置,并从-1和1插入其值。这是您在MNIST数字数据集上训练的模型上看到的:
InfoGANs的论文链接
pix2pix对传统的GAN做了个小改动,它不再输入随机噪声,而是输入用户给的图片:
但这也就产生了新的问题:我们怎样建立输入和输出的对应关系。此时G GG的输出如果是下面这样,D会判断是真图:
但如果G的输出是下面这样的,D拿来一看,也会认为是真的图片QAQ…也就是说,这样做并不能训练出输入和输出对应的网络G,因为是否对应根本不影响D的判断。
为了体现这种对应关系,解决方案也很简单,你可以也已经想到了:我们把G的输入和输出一起作为D的输入不就好了?于是现在的优化目标变成了这样:
下面是一些应用:
灰度图变彩色图[Isola, Zhu, Zhou, Efros, 2016]:
自动着色 Data from [Russakovsky et al. 2015]:
交互式着色[Zhang*, Zhu*, Isola, Geng, Lin, Yu, Efros, 2017]:
pix2pix必须使用成对的数据进行训练。
但很多情况下成对数据是很难获取到的,比如说,我们想把马变成斑马,现实生活中是不存在对应的真实照片的:
现在我们就用Cycle-constraint Adversarial Network也就是CycleGAN解决这个问题。这种网络不需要成对的数据,只需要输入数据的一个集合(比如一堆马的照片)和输出数据的一个集合(比如一堆斑马的照片)就可以了。
但是(没错我又要说但是了),直接使用不成对的数据是不奏效的。网络会直接忽略输入,随机产生输出!所以,我们还得对网络增加**限制(constraint)**才行。
那怎么加限制呢?我们来思考一个现实问题。马克吐温认为,如果一把一段话从英文翻译成法文,再从法文翻译回英文,那么你应该得到跟之前原始输入的英文一样的内容。这里也是一样,如果我们把马变成斑马,然后再变回马,那么最后的马和开始输入的马应该是一样的。
面讲一下具体技术细节。除了之前提到的把马变成斑马的网络G,我们还需要一个把斑马变回马的网络F。
那么,一匹马x用G变成斑马s = G ( x ) ,然后再用F把它变回马F ( s ),得到的马和一开始的马应该是一样的,也就是x = F ( G ( x ) ) 。
反过来,斑马变马再变回斑马也要满足要求,注意这一步最好不要省略。虽然理论上只用一个条件是可以的,但是现实实现中,有很多因素,比如计算的准备度,优化的问题,应用中都是把所有约束都加上。
我们同时优化G和F,最后就能拿到一个想要的网络G。
CycleGAN为什么有效
CycleGAN成功的原因在于它分离了风格(Style)和内容(content)。人工设计这种分离的算法是很难的,但有了神经网络,我们很容易让它学习者去自动保持内容而改变风格。
本文链接:http://task.lmcjl.com/news/5656.html