本文基于2015年的经典论文:Deep Generative Image Models using a Laplacian Pyramid of Adversarial Networks
论文下载地址:https://arxiv.org/abs/1506.05751
LAPGAN是建立在GAN和CGAN基础上的成功尝试。在本文中,LAPGAN依然主要被用于生成图像。
一、基础知识
1 CGAN
有一篇论文单独讨论CGAN,这篇论文内容并不多因此没有单独写文章详解这篇论文。它主要是在GAN的基础上加上了条件,这样可以缓解GAN中生成的样本过于自由的问题。具体方法是:将一个条件变量与噪声和真实样本经过一定数量的层次后分别进行concat。更多的解释可以移步这篇博客。
GAN的公式:
其中,h是真实样本,z是噪声。
CGAN的公式:
其中,l是条件变量,它可以是类标,在LAPGAN中,它是图片。
2 图像金字塔
本文中用到了高斯金字塔,用于下采样;
以及拉普拉斯金字塔,用于上采样。
高斯金字塔的构造过程:
(1) 对图像进行高斯核卷积
(2) 将偶数行除去
用公式表示就是:
拉普拉斯金字塔的构造过程:
数学定义:
式中的表示第i层的图像。而UP( )操作是将源图像中位置为(x,y)的像素映射到目标图像的(2x+1,2y+1)位置,即在进行向上取样。符号 表示卷积, 为5x5的高斯内核。
也就是说,拉普拉斯金字塔是通过源图像减去先缩小后再放大的图像的一系列图像构成的。
如图所示,上方的人像从左向右是高斯金字塔自底而上的构建过程,下方的人像是拉普拉斯金字塔自顶向下构建的过程。
在论文原文中是这样描述的:
先构建高斯金字塔:
I0是原图,I1到IK都是由它之前的I经过下采样得到的。K是金字塔的级数,我们希望金字塔的级数能够让IK的像素足够小,<=8*8为宜。
第K层的拉普拉斯金字塔:
其他层的拉普拉斯金字塔:
用拉普拉斯金字塔恢复图像:
需要注意,文中为了简化计算,用的上采样和下采样方法与常规的高斯金字塔和拉普拉斯金字塔生成方式有差异。它取下采样的方式就是互不相交的2*2的区域中像素求均值,生成拉普拉斯金字塔的方式就是在原图上的2*2区域减去刚才算出来的均值。在它提供的代码中,上采样和下采样完全交给了Torch的image包实现(image.scale)。
二、LAPGAN原理:
1 用途:生成高品质的自然图片
2 创新点:利用拉普拉斯金字塔,由粗到精逐级生成越发清楚的图像。
3 突破:GAN只能生成低像素的图片,而LAPGAN可以生成高像素的图片。
4 本质:用CGAN生成拉普拉斯金字塔。
该图描述了LAPGAN的训练过程,图中的I0是64*64的图像,一共使用了3个GAN,I1为32*32,I2为16*16,I3为8*8。
拉普拉斯金字塔的顶端(也就是像素最低的图像)用来训练普通的GAN ,生成器的输入只有噪声。而后像素更高的图像用来训练CGAN,输入的不光有噪声,还有同级的高斯金字塔的图像经过上采样后得到的图像(在一些情况下,还会加入类标,这个我们在后面的实验中详细介绍)。
该图描述了训练好了的LAPGAN的使用过程。
5 LAPGAN的优点:
①与Residual Network有异曲同工之妙,针对残差的逼近和学习相对容易。
②逐级独立训练提高了网络简单记忆输入样本的难度,许多高性能的深度网络都面临着这样的问题。
③减少了每一次 GAN 需要学习的内容,也就从而增大了 GAN 的学习能力。
三、模型和训练
本文使用了三个数据集:
(1) CIFAR10:32*32,10类,共100k训练样本
(2) STL:96*96,10类,共100k训练样本
(3) LSUN:下采样到64*64,10个不同自然场景,共10M训练样本
实验平台:Torch
源代码:https://github.com/facebook/eyescream
https://gist.github.com/soumith/e3f722173ea16c1ea0d9
在所有的模型中,噪声向量zk中的值都服从相同的分布,落在[-1,1]的区间内。
针对CIFAR10和STL:
最初的尺寸:作用域8*8分辨率的图像上,GK和DK都使用有两个隐藏层的全连接神经网络,激活函数为ReLU。DK使用了Dropout,每层有600个神经元。GK每层有1200个神经元。ZK是一个100维的向量。
后续的尺寸:对CIFAR10而言,通过在原始图像上裁剪28*28的图像扩充数据。金字塔的图像尺寸按照8*8到14*14到28*28扩大。对STL而言,图像尺寸按照8*8到16*16到32*32到64*64到96*96扩大。CIFAR10和STL的神经网络都由拥有三层的Gk和2层的Dk组成。噪声输入作为第四个通道和图像输入的三通道放在一起。
蓝色箭头指向的图片(也就是下采样后再上采样的模糊图片),在CGAN中的地位就是条件变量。
值得注意的是,在生成器中的卷积层是作者自己定义的SpatialConvolutionUpsample层,因为我们需要最后生成的图片和输入图片的大小一样,因此每次卷积前都会将feature map补零到卷积后恰好仍为原来的尺寸。
在CIFAR10中,作者还做了将类标也作为条件变量的实验。CIFAR10有10类,条件变量是长度为10的独热码向量。如果图片的尺寸为x*x*3(三通道),那么就将条件变量经过一个全连接层得到长度为x*x的向量,将向量重新排列得到x*x的图像,与原先的输入concate,具体如下图所示。
参数选择:
初始学习率:0.02
学习率下降方式:每完成一个epoch将学习率除以1.000004
初始动量:0.8
动量上升方式:每完成一个epoch将动量增加0.0008
在训练过程中,作者利用Parzen窗估计器检测对数似然函数(具体怎么检测在【第四部分 实验和评估】中详述)。注意:监测只是查看,是在验证集上做的工作,这个结果不会在训练过程中计算,更不会反向传播,训练过程中的损失反向传播与常规的CGAN和GAN相同。
针对LSUN:
LSUN的数据量比较大,因此可以对它的每一个场景分别训练一个LAPGAN模型。这样就可以在评估过程中理解模型学习到的分布的差异。LSUN使用的模型比CIFAR10略大,但内部结构大同小异,这里放上网络结构,不再赘述。
四、实验和评估
本文使用了3个不同的评估指标:
(1) 对数似然函数
(2) 直观查看生成图片
(3) 人工主观评估
1 对数似然函数
本文对拉普拉斯金字塔上每一个尺度的模型都进行了一次利用高斯Parzen窗的对数似然函数评估。下面介绍如何计算高斯Parzen窗的对数似然函数。
对某一层的图像I而言,它的下采样是d(I),记为l,上采样是u(d(I)),将I-u(d(I))记为h。构建下方的概率密度函数,描述当前的h是真实的I-u(d(I))产生的可能性。
这事实上是一个条件概率的表达式,q1(l)是真实图像I下采样为l的概率,q0(l,h)是在已知下采样的图片为l的条件下,h为真实的I-u(l)的概率。
这样,我们有:
对每个固定的l,得到:
因此:
q1和q0都用高斯Parzon窗计算:
其中, 是用验证集调整的参数。
由于在生成图像时,前一层生成的图像又作为后一层的下采样图像使用,也就是说,p(I)在生成更大尺寸的图片时就处于q1(l)的位置。
因此求最后一层的对数似然函数时有这样的关系:
实验结果显示,LAPGAN比常规的GAN效果更好。
2 直观查看生成的图片
下图显示了在CIFAR10上训练的生成模型生成的图像。从中可以看出:
① 我们的GAN做得比以前的论文好,这可能要归功于CIFAR10上的数据扩充(每张图裁了4个28*28);
② LAPGAN优于GAN,边缘更加锐利;
③ 引入类标条件的LAPGAN优于普通LAPGAN,物体结构更加清晰;
④ 最右侧的一列是与生成的图片最相近的真实图片,从中可以生成模型不是简单记忆训练数据。
下图显示了在STL上训练的生成模型生成的图片。图a中,虽然物体的形状不清晰,但是依然保持着锐利的边缘。图b中可以看到图片逐层产生的过程。
下图显示了在LSUN上训练的生成模型生成的图片,展示了塔,卧室和教堂前。
接下来以(a)图举例,a图做了塔的实验,从左到右是4*4扩充到64*64的过程。每一行之间使用的噪声向量是相同的,只有每行最开始生成4*4的图片时,输入的噪声向量是不同的,这些有差异的噪声向量是用插值的方式逐步过渡的。如果网络过拟合了——也就是说,如果网络知识简单记忆训练样本,在生成的图像上我们可以观察到突变。但是实际上,我们可以观察到,生成的图像是平滑变化的,它们看起来也貌似真实,而不是线性地融合两张真实图像。
作者在LSUN还做了很多其他实验,有兴趣可以查阅论文原文。
3 人工主观评估
作者让15位志愿者参与评估实验,看他们是否能区分生成的图片和真实的图片。用户的评估界面如下图所示。呈现给志愿者的图片从以下四个类别的图片中随机选取:三个用CIFAR10训练得到的生成模型生成的图片(LAPGAN,加了类标条件的LAPGAN,标准的GAN)以及真实的CIFAR10图片。由于精确度收到观察时间的影响,因此作者随机选取图片的展示时间(从50ms到2000ms不等),一旦超过了展示时间,图像会被遮挡。在实验开始前,会给志愿者展示CIFAR10中的真实图片。在从志愿者那里收集了10k数量级的样本后绘制了下图的结果图像。结果显示,LAPGAN生成以假乱真的图片的能力优于普通GAN。
图中,竖线显示的是个体间的差异。
转载自原文链接, 如需删除请联系管理员。
原文链接:GAN学习笔记(二)——LAPGAN,转载请注明来源!