Matalb实现基于生成对抗网络(GAN)的图片生成——附代码

目录

摘要:

生成对抗网络的介绍:

生成对抗网络的训练方案:

生成对抗网络的构建:

(1)生成器网络:

(2)判别器网络:

本文模型运行结果展示:

本文Matlab代码分享: 


摘要:

生成对抗网络 (GAN) 是一种深度学习网络,它能够生成与真实输入数据具有相似特征的数据。本文基于Matlab平台,使用Matlab自带的深度学习工具箱和自带的训练数据,构建了卷积生成对抗网络(DCGAN),实现了对彩色图片的样本生成,其中生成器的输入是噪声序列,输出是生成的图片;判别器的输入是真实的图片和生成器生成的虚伪图片,输出是该图片是真实图片的概率。生成对抗网络训练过程中生成器和判别器互相对抗,最后到达平衡,即生成器生成的图片使得判别器无法判断是真实的还是虚假的。

一个GAN由两个一起训练的网络组成:

生成器 - 给定随机值(潜在输入)向量作为输入,此网络可生成与训练数据具有相同结构的数据。

判别器 - 给定包含来自训练数据和来自生成器的生成数据的观测值的数据批量,此网络尝试将观测值划分为"real"或"generated"。

本文注释清楚,几乎每一行都有注释,适合新手入门学习

生成对抗网络的介绍:

生成式对抗网络(GAN,GenerativeAdversarialNetworks)是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。模型通过框架中(至少)两个模块:生成模型(GenerativeModel)和判别模型(DiscriminativeModel)的互相博弈学习产生相当好的输出。原始GAN理论中,并不要求G和D都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为G和D。一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。

机器学习的模型可大体分为两类,生成模型(GenerativeModel)和判别模型(DiscriminativeModel)。判别模型需要输入变量,通过某种模型来预测。生成模型是给定某种隐含信息,来随机产生观测数据。举个简单的例子:

(1)生成模型:给一系列猫的图片,生成一张新的猫咪(不在数据集里)

(2)判别模型:给定一张图,判断这张图里的动物是猫还是狗

对于判别模型,损失函数是容易定义的,因为输出的目标相对简单。但对于生成模型,损失函数的定义就不是那么容易。我们对于生成结果的期望,往往是一个暧昧不清,难以数学公理化定义的范式。所以不妨把生成模型的回馈部分,交给判别模型处理。这就是Goodfellow他将机器学习中的两大类模型,Generative和Discrimitive给紧密地联合在了一起。

GAN的基本原理其实非常简单,这里以生成图片为例进行说明。假设我们有两个网络,G(Generator)和D(Discriminator)。正如它的名字所暗示的那样,它们的功能分别是:G是一个生成图片的网络,它接收一个随机的噪声z,通过这个噪声生成图片,记做G(z)。D是一个判别网络,判别一张图片是不是“真实的”。它的输入参数是x,x代表一张图片,输出D(x)代表x为真实图片的概率,如果为1,就代表100%是真实的图片,而输出为0,就代表不可能是真实的图片。

在训练过程中,生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而D的目标就是尽量把G生成的图片和真实的图片分别开来。这样,G和D构成了一个动态的“博弈过程”。

最后博弈的结果是:在最理想的状态下G可以生成足以“以假乱真”的图片G(z)。对于D来说,它难以判定G生成的图片究竟是不是真实的,因此D(G(z))=0.5这样我们的目的就达成了:我们得到了一个生成式的模型G,它可以用来生成图片。Goodfellow从理论上证明了该算法的收敛性[1],以及在模型收敛时,生成数据具有和真实数据相同的分布(保证了模型效果)公式中x表示真实图片,z表示输入G网络的噪声,G(z)表示G网络生成的图片,D(·)表示D网络判断图片是否真实的概率。

生成对抗网络的训练方案:

首先,建立图像样本库需要大量图像,本文的图片数据集来自Matlab软件的自带数据库,直接可调用无需安装,然后按照固定比例划分训练集和测试集,并对样本进行标准化处理,使图像大小保持,每一张图片拥有唯一ID。

其次,选择CNN作为DCGAN的基础网络,对CNN的池化层和全连接层进行调整。DCGAN是一种深度卷积网络,可以实现目标特征提取以及图像分类。在定义DCGAN中的生成网络和判别网络时,通过增加ReLU、Sigmoid等激活函数用于参数处理、图像分类等工作。

在训练网络之前,使用Matlab作为框架,Matlab作为编程语言完成代码编写,利用Adam优化器最小化损失函数,优化程序调整超参数。训练网络时,使用深度学习工具箱的功能实现训练过程的可视化,通过控制学习率、迭代次数、训练比例等参数,设置多组对照实验,观察实验结果并利用测试集进行多次测试。

将多组实验结果进行对比分析,可得到一组最优网络参数,利用训练好的目标网络模型,便可输出多张不同的图像。

生成对抗网络的构建:

(1)生成器网络:

本文的生成器网络以CNN作为内核,该模型的输入为100*1的随机噪声,输出为生成图片,两个卷积层之间使用ReLU和BN层加快训练过程,防止模型过拟合,使用三层卷积的方式加深网络的深度,最后使用tanh作为激活函数输出生成图片。

(2)判别器网络:

本文的判别器网络同样使用CNN作为内核,该模型的输入为64*64真实的和生成的图片,输出为该图片属于真实或虚伪的概率,两个卷积层之间使用批量归一化层和泄漏ReLU层进行连接,通过三层卷积的方式加深网络的深度,最后通过sigmoid激活函数输出图片是真实还是虚伪的概率。

本文模型运行结果展示:

训练开始:

训练结束:

生成的图像:

本文Matlab代码分享: 

猜你喜欢

转载自blog.csdn.net/widhdbjf/article/details/129399435