前面咱们用 TensorFlow 写了简单的 cifar10 分类的代码,获得还不错的结果,下面咱们来研究一下生成式对抗网络 GAN,而且用 TensorFlow 代码实现。网络
自从 Ian Goodfellow 在 14 年发表了 论文 Generative Adversarial Nets 以来,生成式对抗网络 GAN 广受关注,加上学界大牛 Yann Lecun 在 Quora 答题时曾说,他最激动的深度学习进展是生成式对抗网络,使得 GAN 成为近年来在机器学习领域的新宠,能够说,研究机器学习的人,不懂 GAN,简直都很差意思出门。机器学习
下面咱们来简单介绍一下生成式对抗网络,主要介绍三篇论文:1)Generative Adversarial Networks;2)Conditional Generative Adversarial Nets;3)Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks。学习
首先来看下第一篇论文,了解一下 GAN 的过程和原理:优化
GAN 启发自博弈论中的二人零和博弈(two-player game),GAN 模型中的两位博弈方分别由生成式模型(generative model)和判别式模型(discriminative model)充当。生成模型 G 捕捉样本数据的分布,用服从某一分布(均匀分布,高斯分布等)的噪声 z 生成一个相似真实训练数据的样本,追求效果是越像真实样本越好;判别模型 D 是一个二分类器,估计一个样原本自于训练数据(而非生成数据)的几率,若是样原本自于真实的训练数据,D 输出大几率,不然,D 输出小几率。能够作以下类比:生成网络 G 比如假币制造团伙,专门制造假币,判别网络 D 比如警察,专门检测使用的货币是真币仍是假币,G 的目标是千方百计生成和真币同样的货币,使得 D 判别不出来,D 的目标是千方百计检测出来 G 生成的假币。如图所示:.net
在训练的过程当中固定一方,更新另外一方的网络权重,交替迭代,在这个过程当中,双方都极力优化本身的网络,从而造成竞争对抗,直到双方达到一个动态的平衡(纳什均衡),此时生成模型 G 恢复了训练数据的分布(造出了和真实数据如出一辙的样本),判别模型再也判别不出来结果,准确率为 50%,约等于乱猜。orm
上述过程能够表述为以下公式:blog
当固定生成网络 G 的时候,对于判别网络 D 的优化,能够这样理解:输入来自于真实数据,D 优化网络结构使本身输出 1,输入来自于生成数据,D 优化网络结构使本身输出 0;当固定判别网络 D 的时候,G 优化本身的网络使本身输出尽量和真实数据同样的样本,而且使得生成的样本通过 D 的判别以后,D 输出高几率。ci
第一篇文章,在 MNIST 手写数据集上生成的结果以下图:深度学习
最右边的一列是真实样本的图像,前面五列是生成网络生成的样本图像,能够看到生成的样本仍是很像真实样本的,只是和真实样本属于不一样的类,类别是随机的。it
第二篇文章想法很简单,就是给 GAN 加上条件,让生成的样本符合咱们的预期,这个条件能够是类别标签(例如 MNIST 手写数据集的类别标签),也能够是其余的多模态信息(例如对图像的描述语言)等。用公式表示就是:
式子中的 y 是所加的条件,结构图以下:
生成结果以下图:
图中所加的条件 y 是类别标签。
第三篇文章,简称(DCGAN),在实际中是代码使用率最高的一篇文章,本系列文的代码也是这篇文章代码的初级版本,它优化了网络结构,加入了 conv,batch_norm 等层,使得网络更容易训练,网络结构以下:
能够有加条件和不加条件两种网络,论文还作了好多试验,展现了这个网络在各类数据集上的结果。有兴趣同窗能够去看论文,此文咱们只从代码的角度理解去理解它。
参考文献:
1. http://blog.csdn.net/solomon1558/article/details/52549409