参考博文:
https://www.cnblogs.com/skyfsm/p/6790245.html
一般的CNN结构依次为:
GAN模型是由以下两个模型构成的:
在GAN的框架中,有两个模型,一是生成模型G,另一个是判别模型D。生成模型G主要用于根据给定的隐含信息来随机生成观测数据,判别模型D主要是输入变量,通过模型来预测它是真实的数据还是虚假的数据。
在GAN中,我们不断地训练模型,目的就是为了得到一个效果良好的生成模型,可以生成与数据集中的真实数据相似的的数据,这就是GAN中的“生成”的含义。
而由于G希望不断更新,生成更加真实的数据,试图欺骗D,而D也不断更新,提升自己鉴别数据的能力,希望能够将G生成的数据和真实数据区分开来,从而产生了一个博弈过程,这也就是GAN中的“对抗”的含义。
详细说明可参考我的另一篇博文:生成式对抗网络(Generative Adversarial Nets,GAN)
将生成式对抗网络GAN中的生成器G和判别器D中的多层感知机用改进后的卷积神经网络CNN替代。
使用步长卷积代替确定性的空间池化函数(例如:最大池化),允许网络学习自己的空间下采样。在生成器和判别器中使用这种方法,这样能允许生成器学习自己的空间采样。
在卷积特征上消除完全连接层的趋势。例如:全局平均池化。
全局平均池化提高了模型的稳定性,但是降低了收敛速度。
将最高卷积特性直接连接到生成器和判别器的输入输出的中间地带工作得很好。
通过将每个单元的输入标准化,使其均值和单位方差为0,从而稳定学习。这有助于处理由于初始化不良而出现的训练问题,并有助于在更深层次的模型中实现梯度流。
这对于让深层生成器开始学习非常关键,可以防止生成器将所有样本压缩到一个点,这是在GANs中观察到的常见故障模式。
但是,直接将批规范化应用于所有层,会导致样本振荡和模型的不稳定。通过不在生成器输出层和判别器输入层中应用批规范化,避免了这种情况。
分析:
Q: 为什么生成器中输出层使用Tanh,其余层均使用ReLU激活?
这是因为使用有界激活可以使模型更快地学习饱和并覆盖训练分布的颜色空间。
生成器的最后一层要输出图像,而图像的像素是有取值范围的([0, 255]),ReLU函数的输出可能会很大,而Tanh函数的输出介于[-1, 1]之间。
DCGAN使用的激活函数讲解
【对图1的说明:用于LSUN场景建模的DCGAN生成器。将100维均匀分布Z投影到一个具有很多特征映射的小空间范围的卷积表示上。一系列的四个微步长卷积(在最近的一些论文中,这些被错误地称为反卷积)将这个高级表示转换成一个64 * 64像素的图像。值得注意的是,没有使用完全连接或池层。】
正式实验时使用的数据集略有不同,对实验中使用的数据集的介绍请参看我的另一篇博文:DCGAN程序所用数据库
实验中进行的预处理只是将训练图像缩放到tanh激活函数的范围[-1, 1]内。
随着生成图像模型中样本的视觉质量的提高,训练样本的过拟合和记忆问题开始受到更多的关注。为了演示我们的模型是如何使用更多的数据和更高的分辨率进行扩展,我们在LSUN卧室数据集中训练了一个模型,该数据集包含300多万个训练示例。最近的分析表明,模型的学习速度与其泛化性能之间存在着直接联系。
下图为训练了一个纪元之后的模型生成的样本,用于模拟在线学习,以此证明我们的模型并没有通过简单的过拟合/记忆训练示例来生成高质量的样本。
(注:在实验中未对图像进行数据增强处理)
为了进一步降低生成器记忆输入示例的可能性(图2),我们执行了一个简单的图像去重过程。我们在32x32下采样中心作物的训练实例上拟合了一个3072-128-3072去噪dropout正规化RELU自动编码器。然后,通过对ReLU激活进行阈值转换,将生成的代码层激活进行二值化,这已被证明是一种有效的信息保存技术(Srivastava et al., 2014),并提供了一种方便的语义哈希形式,允许线性时间去重。对哈希冲突的可视化检查显示出很高的精度,估计的假阳性率低于1 / 100。此外,该技术检测并删除了近275,000个重复项,表明召回率很高。
【对图2的说明:通过数据集生成经过一次训练后的卧室。从理论上讲,该模型可以学习记忆训练实例,但在实验上,这是不可能的,因为我们的训练具有较小的学习率和小批量SGD。我们没有注意到先验经验证据表明具有SGD和较低的学习速度的训练具有记忆能力。】
【对图3的说明:经过五个训练纪元后产生的卧室。似乎有证据表明,在多个样品(例如某些床的基板)上通过重复的噪声纹理进行视觉欠拟合。】
我们从对人名的随机网络图像查询中提取包含人脸的图像。这些人的名字是从dbpedia中获得的,可证明他们出生在现代。这个数据集有来自10000人的300万张照片。我们在这些图像上运行OpenCV人脸检测器,保持足够高的分辨率检测,这给了我们大约35万个人脸盒。我们用这些面框来训练。(注:在实验中未对图像进行数据增强)。
我们使用Imagenet-1k (Deng et al., 2009)作为自然图像的来源进行无监督训练。我们在32*32的最小尺寸的中心作物上训练。(注:在实验中未对图像进行数据增强)。
评估无监督表示学习算法质量的一种常用技术是将其作为特征提取器应用于监督数据集,并对基于这些特征的线性模型的性能进行评价。
具体实验:
我们在Imagenet-1k上进行训练,然后使用来自所有层的判别器的卷积特性,最大汇聚每个层的表示来生成一个4*4空间网格。然后将这些特征进行扁平化拼接,形成一个28672维的向量,并在其上训练一个正则化线性L2-SVM分类器。
【对表1的说明:使用我们的预训练模型得到的CIFAR-10分类结果。我们的DCGAN不是在CIFAR-10上进行预训练,而是在Imagenet-1k上进行预训练,然后将这些特征用于对CIFAR-10图像进行分类。】
实验结果分析:
与Exampler CNN相比结果稍差一些,但可以通过微调判别器的表示来改进,这个留到之后的工作中解决;
由于模型从未在CIFAR-10上进行过训练,但是却能得到一个较好的结果,这说明学得特征的域鲁棒性。
在StreetView House Numbers dataset (SVHN)中,当标记数据稀缺时,我们使用DCGAN的鉴别器的特性进行监督。按照CIFAR-10实验中类似的数据集准备规则,我们从非额外集中分离出一个包含10,000个示例的验证集,并将其用于所有超参数和模型选择。随机选取1000个均匀类分布训练实例,在CIFAR-10特征提取管道上训练正则化线性L2-SVM分类器。
实验结果分析:
该模型实现了一个明显更高的验证误差—28.87%
我们做的第一个实验是了解潜在空间的景观。行走在学习的流形上通常可以告诉我们记忆的迹象(如果有明显的过渡),以及空间分层折叠的方式。如果在这个潜在空间中行走导致对图像生成的语义变化(例如添加和删除对象),我们可以推断出模型已经学习了相关的和有趣的表示。结果如图4所示。
【对图4的说明:最上面几行:Z中一系列随机的9个点之间的插值显示,学习到的空间具有平滑的过渡,空间中的每一张图像看起来都像是卧室。在第六排,你看到一个没有窗户的房间慢慢地变成了一个有巨大窗户的房间。在第10行,你看到一个看起来像电视的东西慢慢地变成了一扇窗户。】
以前的工作已经证明,在大型图像数据集上对CNNs进行监督训练可以产生非常强大的学习功能(Zeiler &费格斯,2014)。此外,接受过场景分类训练的受监督的CNNs能够学习对象检测(Oquab et al., 2014)。我们证明了在大型图像数据集上训练的无监督DCGAN也可以学习有趣的特性层次结构。利用(Springenberg et al., 2014)提出的引导反向传播,我们从图5中可以看出,判别器学习到的特征在卧室的床、窗等典型部位被激活。为了进行比较,在同一图中,我们为随机初始化的特性提供了一个基线,这些特性在语义相关或有趣的内容上没有被激活。
【对图5的说明:在右侧,最大轴对齐的引导反向传播的可视化对应于从判别器的最后一个卷积层中学得的前六个卷积特征。请注意,很少有特征对应床—LSUN卧室数据集中的中心对象。左边是一个随机过滤器基线。与以往的研究结果相比,几乎没有歧视和随机结构。】
样本的质量表明,生成器学习了主要场景组件(如床、窗、灯、门和其他家具)的特定对象表示。为了探索这些表示采用的形式,我们进行了一个实验,试图从生成器中完全删除窗口。
在150个样本中,手工绘制了52个窗口边界框。对于第二高卷积层特征,利用绘制的边界框内的激活为正,相同图像的随机样本内的激活为负的准则,拟合逻辑回归预测特征激活是否在窗口上(或不在窗口上)。使用这个简单的模型,所有权重大于零(总计200)的特征图都从所有空间位置删除。然后,在去除和不去除特征图的情况下,随机生成新的样本。
生成的带有和不带有窗口的图像如图6所示,有趣的是,网络大多忘记在卧室中绘制窗口,并会用其他对象替换它们。
【对图6的说明:第一行:未修改的模型样本。底部行:删除窗口过滤器生成的相同示例。一些窗户被移除,另一些则被转换成具有类似视觉外观的物体,如门和镜子。虽然视觉质量下降了,但整体场景构成保持不变,这表明生成器在将场景表示与对象表示分离方面做得很好。可以通过扩展实验从图像中删除其他对象并修改生成器绘制的对象。】
在评估单词的学习表示的背景下(Mikolov等,2013)证明了简单的算术运算在表示空间中显示出丰富的线性结构。一个权威的例子证明了向量(King) - 向量(Man)+向量(Woman)导致了一个最近邻是Queen的向量。我们研究了类似的结构是否出现在我们的生成器的Z表示中。我们对视觉概念的示例样本集的Z向量进行了类似的运算。对每个概念只处理单个样本的实验是不稳定的,但是对三个样本的Z向量进行平均表明,生成的Z向量一致且稳定,在语义上服从该算法。除了如图7所示的对象操作,我们还证明了面部姿势在Z空间中也是线性建模的(图8)。
这些证明表示,可以使用我们的模型学习的Z表示来开发有趣的应用程序。先前已经证明,条件生成模型可以学习令人信服地建模对象属性,如缩放、旋转和移位(Dosovitskiy et al., 2014)。据我们所知,这是在纯无监督模型中首次证明这种情况。进一步探索和发展上述矢量算法,可以大大减少复杂图像分布的条件生成建模所需的数据量。
【对图7的说明:视觉概念的矢量算术。 对于每列,样本的Z向量被平均。 然后对平均向量执行算术,从而创建新的向量Y。通过将Y作为输入馈送到生成器来产生右侧的中心样本。为了证明生成器的插值能力,将用比例+ -0.25采样的均匀噪声添加到Y以产生8个其他样本。 在输入空间中应用算术(底部两个示例)会导致由于未对准而产生的噪声重叠。】
【对图8的说明:一个转弯矢量是由四个面向左边和面向右边的人脸的平均样本创建的。通过沿着这条轴向随机样本添加插值,我们能够可靠地转换它们的姿态。】
我们提出了一套更稳定的生成对抗网络训练体系结构,并证明了在监督学习和生成建模中,生成对抗网络能够很好地学习图像表示。仍然存在一些模型不稳定的形式——我们注意到,随着模型训练时间的延长,它们有时会将滤波器子集折叠成一个单一的振荡模式。
需要进行进一步的工作来从不稳定中解决这一问题。我们认为将这个框架扩展到其他领域,例如视频(用于帧预测)和音频(用于语音合成的预训练特性),应该会非常有趣。进一步研究所学习的潜在空间的性质也将是有趣的。
## 七、算法实现
参看我的另一篇博文:DCGAN实现