课程作业原地址:CS231n Assignment 3
作业及整理:@邓姸蕾 && @Molly && @寒小阳
时间:2018年2月。
出处:http://blog.csdn.net/han_xiaoyang/article/details/79316554
引言
CS231N到目前位置,所有对神经网络的应用都是判别式模型,给定一个输入,训练产生一个label输出。从直接对一个图片的分类到句子生成(也是一个分类问题,我们的label是在词空间中,我们会去逐个学习来产生多词label)。在这个作业中,我们会拓展开来,用神经网络来构建一个生成式模型。特别的,我们会学习如何构建模型来生成与训练集类似的图片。
GAN是什么?
在2014年,Goodfellow et al.发表了训练生成模型的一个方法:生成对抗网络(GANs)。在一个GAN中,我们构建两个不同的神经网络。 第一个网络是传统的分类网络叫判别器。 我们会用判别器来判断图片是真实的(属于训练集)还是假的(不在训练集中)。另一个网络,叫做生成器,会把随机噪音作为输入,然后用一个神经网络通过它生成图片。生成器的目标就是为了骗过判别器,让判别器以为生成的图片是真的。
我们可以把这个想成是一个最小最大博弈(minimax game), 生成器 ( G G G)反复的想要糊弄判别器,而判别器 ( D D D)则要努力的正确区分真实还是假的。
minimize G    maximize D    E x ∼ p data [ log D ( x ) ] + E z ∼ p ( z ) [ log ( 1 − D ( G ( z ) ) ) ] \underset{G}{\text{minimize}}\; \underset{D}{\text{maximize}}\; \mathbb{E}_{x \sim p_\text{data}}\left[\log D(x)\right] + \mathbb{E}_{z \sim p(z)}\left[\log \left(1-D(G(z))\right)\right] GminimizeDmaximizeEx∼pdata[logD(x)]+Ez∼p(z)[log(1−D(G(z)))]
其中 x ∼ p data x \sim p_\text{data} x∼pdata 是来自于输入数据的样本, z ∼ p ( z ) z \sim p(z) z∼p(z) 是随机噪音样本, G ( z ) G(z) G(z) 是用生成网络 G G G生成的图片, D D D 是判别器的输出,指的是一个输入是真实图片的概率。 在Goodfellow et al., 他们分析了最小最大博弈并且展示了它和最小化训练数据分布和 G G G的生成样本分布之间的Jensen-Shannon散度的关系。
为了优化这个最小最大博弈,我们会在对于 G G G的目标上采用梯度下降和在 D D D的目标上采用梯度上升之间转换。
- 更新生成器( G G G)来最小化__判别器做出正确选择__的概率
- 更新判别器( D D D)来最大化__判别器做出正确选择__的概率
虽然这些更新理论上是有很有用的,但是在实际中他们表现并不好。取而代之的是,当我们更新生成器的时候,我们会用不同的目标函数:最大化判别器做出错误选择的概率。这一个小小的改变减轻了由于判别器置信度非常高的时候导致的生成器梯度消失的问题。这也是在大部分GAN的论文中的标准更新方法,并且在 Goodfellow et al.原始论文中也是这么用的。
在这个作业中,我们会交替进行下面的更新:
- 更新生成器( G G G)来最大化判别器在生成数据上做出错误选择的概率
maximize G    E z ∼ p ( z ) [ log D ( G ( z ) ) ] \underset{G}{\text{maximize}}\; \mathbb{E}_{z \sim p(z)}\left[\log D(G(z))\right] GmaximizeEz∼p(z)[logD(G(z))] - 更新判别器( D D D)来最大化判别器在真实以及生成数据上做出正确选择的概率
maximize D    E x ∼ p data [ log D ( x ) ] + E z ∼ p ( z ) [ log ( 1 − D ( G ( z ) ) ) ] \underset{D}{\text{maximize}}\; \mathbb{E}_{x \sim p_\text{data}}\left[\log D(x)\right] + \mathbb{E}_{z \sim p(z)}\left[\log \left(1-D(G(z))\right)\right] DmaximizeEx∼pdata[logD(x)]+Ez∼p(z)[log(1−D(G(z)))]
一些其它的工作
自2014年以来,GAN被应用到广泛的研究领域中,有大量的workshops,以及上百篇论文。 相比于生成模型的其它方法,他们通常生成最高质量的样本,但是训练起来也是最难和繁琐的(详见this github repo 包含了17中方法,对于训练模型很有帮助)。提升GAN的训练的稳定性和鲁棒性一直是一个开放的研究问题,每天都有新的论文。最近的GANs的教程,详见here.也有一些最近更让人兴奋的工作,把目标函数变成了Wasserstein距离,在不同的模型架构中生成了更加稳定的结果。WGAN, WGAN-GP.
GANs并不是唯一的训练生成模型的方法!对于其它的生成模型可以参考深度学习书book的deep generative model chapter 。 另一个流行的训练神经网络作为生成模型的方法是变分自动编码器(Variational Autoencoders)(co-discovered here and here)。 变分自动编码器用变分推断来训练深度生成模型。这些模型训练起来更稳定和容易,但是现在还没有GANs生成的图片那么漂亮。
你可以预期会生成的图片,如上所示,你的可能稍微有点不一样
构造
from __future__ import print_function, division
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
%matplotlib inline
plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
# A bunch of utility functions
def show_images(images):
images = np.reshape(images, [images.shape[0], -1]) # images reshape to (batch_size, D)
sqrtn = int(np.ceil(np.sqrt(images.shape[0])))
sqrtimg = int(np.ceil(np.sqrt(images.shape[1])</