⽤GAN来做图像⽣成,这是最好的⽅法
在我们之前的⽂章中,我们学习了如何构造⼀个简单的GAN来⽣成MNIST⼿写图⽚。对于图像问题,卷积神经⽹络相⽐于简单地全连接
的神经⽹络更具优势,因此,我们这⼀节我们将继续深⼊GAN,通过融合卷积神经⽹络来对我们的GAN进⾏改进,实现⼀个深度卷积
GAN。如果还没有亲⼿实践过GAN的⼩伙伴可以先去学习⼀下上⼀篇专栏:。
专栏中的所有代码都在我的中,欢迎star与fork。
本次代码在,⾥⾯包含了两个⽂一直很安静原唱 件:
dcgan_mnist:基于MNIST⼿写数据集构造深度卷积GAN模型
dcgan_cifar:基于CIFAR数据集构造深度卷积GAN模型
本⽂主要以MNIST为例进⾏介绍,两者在本质上没有差别,只在细微的参数上有所调整。由于穷学⽣资源有限,没有对模型增加迭代次
数,也没有构造更深的模型。并且也没有选取像素很⾼的图像,⾼像素⾮常消耗计算量。本节只是⼀个抛砖引⽟的作⽤,让⼤家了解
DCGAN的结构,如果有资源的⼩伙伴可以⾃⼰去尝试其他更清晰的图⽚以及更深的结构,相信会取得很不错的结果。
⼯具
Python3
TensorFlow1.0
Jupyternotebook
正⽂
整个正⽂部分将包括以下部分:
-数据加载
-模型输⼊
-Generator
-Discriminator
-Loss
-Optimizer
-训练模型
-可视化
数据加载
数据加载部分采⽤TensorFlow中的input_data接⼝来进⾏加载。关于加载细节在前⾯的⽂章中已经写了很多次啦,相信看过我⽂章的⼩
伙伴对MNIST加载也⾮常熟悉,这⾥不再赘述。
模型输⼊
在GAN中,我们的输⼊包括两部分,⼀个是真实图⽚,它将直接输⼊给discriminator来获得⼀个判别结果;另⼀个是随机噪声,随机噪
声将作为generator来⽣成图⽚的材料,generator再将⽣成图⽚传递给discriminator获得⼀个判别结果。
上⾯的函数定义了输⼊图⽚与噪声图⽚两个tensor。
Generator
⽣成器接收⼀个噪声信号,基于该信号⽣成⼀个图⽚输⼊给判别器。在上⼀篇专栏⽂章中,我们的⽣成器是⼀个全连接层的神经⽹络,⽽本
节我们将⽣成器改造为包含卷积结构的⽹络,使其更加适合处理图⽚输⼊。整个⽣成器结构如下:
我们采⽤了transpodconvolution将我们的噪声图⽚转换为了⼀个与输⼊图⽚具有相同shape的⽣成图像。我们来看⼀下具体的实现
代码:
上⾯的代码是整个⽣成器的实现细节,⾥⾯包含了⼀些trick,我们来⼀步步地看⼀下。
⾸先我们通过⼀个全连接层将输⼊的噪声图像转换成了⼀个1x4*4*512的结构,再将其reshape成⼀个[batch_size,4,4,512]的形
状,⾄此我们其实完成了第⼀步的转换。接下来我们使⽤个人承诺书怎么写 了⼀个对加速收敛及提⾼卷积神经⽹络性能中⾮常有效的⽅法——加⼊
BN(batchnormalization),它的思想是归⼀化当前层输⼊,使它们的均值为0和⽅差为1,类似于我们归⼀化⽹络输⼊的⽅法。它的
好处在于可以加速收敛,并且加⼊BN的卷积神经⽹络受权重初始化影响⾮常⼩,具有⾮常好的稳定性,对于提升卷积性能有很好的效果。
关于batchnormalization,我会在后⾯专栏中进⾏⼀个详细的介绍。
完成BN后,我们使⽤LeakyReLU作为激活函数,在上⼀篇专栏中我们已经提过这个函数,这⾥不再赘述。最后加⼊dropout正则化。
剩下的transpodconvolution结构层与之类似,只不过在最后⼀层中,我们不采⽤BN,直接采⽤tanh激活函数输出⽣成的图⽚。
在上⾯的transpodconvolution中,很多⼩伙伴肯定会对每⼀层size的变化疑惑,在这⾥来讲⼀下在TensorFlow中如何来计算每⼀
层featuremap的size。⾸先,在卷积神经⽹络中,假如我们使⽤⼀个kxk的filter对mxmxd的图⽚进⾏卷积操作,strides为
s,在TensorFlow中,当我们设置padding='same'时,卷积以后的每⼀个featuremap的height和width为
;当设置padding='valid'时,每⼀个featuremap的height和width为
。那么反过来,如果我们想要进⾏transpodconvolution操作,⽐如将7x7的形状变为14x
14,那么此时,我们可以设置padding='same',strides=2即可,与filter的size没有人事部门职责 关系;⽽如果将4x4变为7x7的话,当设置
padding='valid'时,即,此时s=1,k=4即可实现我们的⽬标。
上⾯的代码中我也标注了每⼀步shape的变化。
Discriminator
Discriminator接收⼀个图⽚,输出⼀个判别结果(概率)。其实Discriminator完全可以看做⼀个包含卷积神经⽹络的图⽚⼆分类器。结
构如下:
实现代码如下:
上⾯代码其实就是⼀个简单的卷积神经⽹络图像识别问题,最终返回logits(⽤来计算loss)与outputs。这⾥没有加⼊池化层的原因在
于图⽚本⾝经过多层卷积以后职业大全 已经⾮常⼩了,并且我们加⼊了batchnormalization加速了训练,并不需要通过maxpooling来进⾏特征
提取加速训练。
LossFunction
Loss部分分别计算Generator的loss与Discriminator的loss,和之前⼀样,我们加⼊labelsmoothing防⽌过拟合,增强泛化能
⼒。
Optimizer
GAN中实际包含了两个神经⽹络,因此对于这两个神经⽹络要分开进⾏优化。代码如下:
这⾥的Optimizer和我们之前不同,由于我们使⽤了Tensor秀才翘尾巴打一字谜 Flow中的batchnormalization函数,这个函数中有很多trick要注意。⾸
先我们要知道,batchnormalization在训练阶段与⾮训练阶段的计算⽅式是有差别的,这也是为什么我们在使⽤batchnormal加拿大的英语 ization
过程中需要指定training这个参数。上⾯使⽤l_dependencies是为了保证在训练阶段能够⼀直更新movingaverages。具体
参考。
训练
到此为⽌,我们就完成了深度卷积GAN的构造,接着我们可以对我世界上最穷的国家 们的GAN来进⾏训练,并且定义⼀些辅助函数来可视化迭代的结果。
代码太长就不放上来了,可以直接去我的GitHub下载。
我这⾥只设置了5轮epochs,每隔100个batch打印⼀次结果,每⼀⾏代表同⼀个epoch下的25张图:
我们可以看出仅仅经过了少部分的迭代就已经⽣成⾮常清晰的⼿写数字,并且训练速度是⾮常快的。
上⾯的图是最后⼏次迭代的结果。我们可以回顾⼀下上⼀篇的⼀个简单的全连接层的GAN,收敛速度明显不如深度卷积GAN。
总结
到此为⽌,我们学习了⼀个深度卷积GAN,并且看到相⽐于之前简单的GAN来说,深度卷积GAN的性能更加优秀。当然除了MNST数
据集以外,⼩伙伴⼉们还可以尝试很多其他图⽚,⽐如我们之前⽤到过的CIFAR数据集,我在这⾥也实现了⼀个60英语 CIFAR数据集的图⽚⽣
成,我只选取了马的图⽚进⾏训练:
刚开始训练时:
训练50个epochs:
这⾥我只设置了50次迭代,可以看到最后已经⽣成了⾮常明显的马的图像,可见深度卷积GAN的优势。
我的GitHub:
上⾯包含了我的专栏中所有的代码实现,欢迎star,欢迎fork。
本文发布于:2023-03-26 07:42:48,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/69d2ddbd2b6fa5d5e22f21fd28fdd6b2.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:15gan.doc
本文 PDF 下载地址:15gan.pdf
留言与评论(共有 0 条评论) |