本篇文章2730字,读完约7分钟
雷锋。(公开号码:雷锋。com)出版社:这篇文章的原作者是田,原文载于作者的《智虎篇——机器不学,雷锋》。com被授权发布。前言
在我们之前的文章中,我们学习了如何构造一个简单的gan来生成mnist手写图片。对于图像问题,卷积神经网络比简单的全连接神经网络具有更多的优势。因此,我们将在这一部分继续深化gan,并通过融合卷积神经网络来改进我们的gan,实现深度卷积gan。如果你没有亲手练习过gan,你可以学习前面的专栏:生成对抗网络的mnist数据生成。
列中的所有代码都在我的github中。欢迎来到星与叉。
该代码位于尼尔森赵/胡志/dcgan,其中包含两个文件:
Dcgan_mnist:基于mnist手写数据集构建深度卷积gan模型
Dcgan_cifar:基于cifar数据集构建深度卷积gan模型
本文以mnist为例进行介绍。mnist和mnist在本质上没有区别,只有细微的参数被调整。由于贫困学生的资源有限,他们没有增加模型的迭代次数,也没有构建更深层次的模型。并且没有选择具有高像素的图像,这消耗了大量的计算。本节仅作为人们理解dcgan结构的指南。如果有资源的朋友可以自己尝试其他更清晰的图片和更深的结构,我相信会取得很好的效果。
工具蟒3
张量流1.0
jupyter笔记本
身体的整个身体部分将包括以下部分:
-数据加载
-模型输入
发电机
-鉴别器
-损失
-优化器
-培训模式
-可视化
数据加载
在数据加载部分,张量流中的input_data接口用于加载。加载的细节在之前的文章中已经写了很多次了,我相信看过我文章的朋友们也非常熟悉mnist加载,所以我就不在这里重复了。
模型输入
在gan中,我们的输入包括两个部分,一部分是真实图像,它将直接输入到鉴别器中以获得鉴别结果;另一种是随机噪声,它将被用作发生器产生图像的材料,然后发生器将产生的图像传递给鉴别器以获得鉴别结果。
上述函数定义了两个张量:输入图像和噪声图像。
发电机
发生器接收噪声信号,基于噪声信号产生图像,并将其输入到鉴别器。在上一个专栏名为生成对抗网络(Generation Confrontation Network,gan)的主数据生成中,我们的生成器是一个具有所有连接层的神经网络。在本节中,我们将生成器转换为具有卷积结构的网络,以使其更适合处理图像输入。整个发电机结构如下:
我们使用转置卷积将我们的噪声图像转换成与输入图像具有相同形状的生成图像。让我们看看具体的实现代码:
上面的代码是整个生成器的实现细节,其中包含一些技巧。让我们一步一步来看看。
首先,我们通过一个完全连接的层将输入噪声图像转换成1×4×4×512的结构,然后将其整形为[batch_size,4,4,512]形状。到目前为止,我们实际上已经完成了转型的第一步。接下来,我们使用一种非常有效的方法来加速收敛和提高卷积神经网络的性能——加入bn(批处理归一化)。它的思想是对当前图层输入进行归一化,使其平均值为0,方差为1,这与我们归一化网络输入的方法类似。它的优点是可以加快收敛速度,而带bn的卷积神经网络受权值初始化的影响很小,具有很好的稳定性,对提高卷积性能有很好的效果。关于批处理规范化,我将在下面的专栏中详细介绍。
bn完成后,我们使用漏relu作为激活函数,我们在最后一列中提到了它,这里不再重复。最后,加入了脱扣正则化。其余的转置卷积结构层是相似的,除了在最后一层,我们直接使用tanh激活函数来输出生成的图片,而不是bn。
在上述换位卷积中,许多小伙伴肯定会想知道每一层的大小变化。这里,我们来谈谈如何计算张量流中每一层的特征图的大小。首先,在卷积神经网络中,如果我们使用k×k滤波器对m×m×d的图像进行卷积,步长为s。在张量流中,当我们设置填充=相同时,卷积后每个特征映射的高度和宽度为;设置填充=有效时,每个要素地图的高度和宽度为。另一方面,如果我们要执行转置卷积运算,例如将7×7的形状改为14×14,那么此时,我们可以设置填充=相同和条纹= 2,这与滤波器的大小无关;如果4 x 4被改为7 x 7,当填充=有效时,即s=1和k=4可以达到我们的目标。
在上面的代码中,我还标记了每一步的形状变化。鉴别器
鉴别器接收图像并输出鉴别结果(概率)。事实上,鉴别器可以看作是一个带有卷积神经网络的图像二值分类器。其结构如下:
实现代码如下:
上述代码实际上是一个简单的卷积神经网络图像识别问题,最后返回logits(用于计算损耗)和输出。这里没有加入汇集层的原因是经过多层卷积后图像本身非常小,我们增加了批量归一化来加快训练,而不是使用最大汇集来加快特征提取的训练。
损失函数
在损耗部分,分别计算了发生器损耗和鉴别器损耗。和以前一样,我们增加了标签平滑来防止过度拟合和提高泛化能力。
优化器
Gan实际上包含两个神经网络,所以这两个神经网络应该分别优化。代码如下:
这里的优化器与我们之前的不同,因为我们在张量流中使用了批处理规范化函数,在这个函数中有很多技巧需要注意。首先,我们应该知道批量归一化的计算方法在训练阶段和非训练阶段是不同的,这就是为什么我们在使用批量归一化的过程中需要指定训练参数。上面使用了Tf.control_dependencies来确保在训练阶段可以随时更新移动平均线。详细信息,请参见张量流中使用批处理规范化的温和指南。
培养
到目前为止,我们已经完成了深度卷积gan的构造,然后我们可以训练我们的gan并定义一些辅助函数来可视化迭代结果。如果代码太长,就不会上传。你可以直接从我的github下载。
我在这里只设置了5个时期,每100批打印一次结果。每行代表同一时代的25张照片:
我们可以看到,仅经过几次迭代就生成了非常清晰的手写数字,并且训练速度非常快。
上图是最后一次迭代的结果。我们可以回顾一下上一篇文章中简单的全连通gan,其收敛速度显然不如深度卷积gan。
到目前为止,我们已经了解了一种深卷积氮化镓,我们可以看到,深卷积氮化镓的性能优于以前的简单氮化镓。当然,除了mnst数据集之外,朋友们还可以尝试许多其他的图片,比如我们以前使用的cifar数据集。我还在这里实现了cifar数据集的图片生成。我只选择了训练用的马的照片:
培训开始时:
列车50时代:
在这里,我只设置了50次迭代,我们可以看到最终生成了一个非常明显的马图像,这显示了深度卷积的优点。
我的偶像:纳尔逊·赵(尼尔森·赵)
它包含我的专栏中的所有代码实现。欢迎来到星空,欢迎来到福克斯。
雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。
标题:用GAN来做图像生成,这是最好的方法
地址:http://www.hcsbodzyz.com/hcxw/11383.html