主要内容

火车生成对抗网络(甘)

这个例子展示了如何训练生成对抗网络生成图像。

生成敌对的网络(GAN)是一种深度学习网络,可以生成具有类似特征的数据作为输入实际数据。

trainNetwork功能不支持培训甘斯,所以你必须实现一金宝app个自定义训练循环。训练GAN使用自定义训练循环,您可以使用dlarraydlnetwork对象自动分化。

氮化镓由火车在一起的两个网络:

  1. 发电机-给定的向量随机值(潜在的输入)作为输入,这个网络生成数据具有相同结构作为训练数据。

  2. 鉴别器——鉴于批次的数据包含从训练数据的观察,从发电机和生成的数据,这个网络分类的观察“真正的”“生成”

这个图表说明了发电机GAN从向量生成图像的网络随机输入。

这个图表说明了氮化镓的结构。

GAN火车,火车两个网络同时最大化的性能:

  • 火车生成器来生成“傻瓜”鉴别器的数据。

  • 培养鉴别器区分真实和生成数据。

发电机的性能优化,最大化的损失时鉴别器生成的数据。即发电机的目的是生成数据,鉴别器分类“真正的”

优化鉴别器的性能,减少损失的鉴别器当批次的真实和生成数据。即鉴别器的目的是不要被“骗”发电机。

理想情况下,这些策略导致发电机产生令人信服的真实数据和鉴频器已经学会强大特性表征,是训练数据的特征。

这个例子使用火车GAN生成图像数据集[1],其中包含图片的花。

负荷训练数据

下载并解压数据集[1]。

url =“http://download.tensorflow.org/example_images/flower_photos.tgz”;downloadFolder = tempdir;文件名= fullfile (downloadFolder,“flower_dataset.tgz”);imageFolder = fullfile (downloadFolder,“flower_photos”);如果~ datasetExists imageFolder disp (“下载花数据集(218 MB)……”)websave(文件名,url);解压(文件名,downloadFolder)结束

创建一个图像数据存储包含鲜花的照片。

imd = imageDatastore (imageFolder IncludeSubfolders = true);

增加数据包括随机水平翻转和调整图片大小64 -,- 64。

增量= imageDataAugmenter (RandXReflection = true);augimds = augmentedImageDatastore (64 [64], imd, DataAugmentation =增压器);

定义生成对抗的网络

氮化镓由火车在一起的两个网络:

  1. 发电机-给定的向量随机值(潜在的输入)作为输入,这个网络生成数据具有相同结构作为训练数据。

  2. 鉴别器——鉴于批次的数据包含从训练数据的观察,从发电机和生成的数据,这个网络分类的观察“真正的”“生成”

这个图表说明了氮化镓的结构。

定义发电机网络

定义以下网络体系结构,生成图像随机向量。

这个网络:

  • 将随机向量的大小100 - 4 -通过- 4 - 512阵列使用项目和重塑手术。

  • 高档的阵列64 -通过- 64 - 3数组使用一系列的转置卷积层批规范化和ReLU层。

这种网络架构定义为一层图和指定以下网络属性。

  • 对于转置卷积层,指定5-by-5过滤器对每层数量减少的过滤器,大步的2,裁剪输出的每条边。

  • 最后转置卷积层,指定三个5-by-5过滤器对应三个RGB通道生成的图像,和上一层的输出大小。

  • 的网络,包括一个双曲正切层。

项目和重塑噪声输入,使用自定义层projectAndReshapeLayer附加到这个例子作为支持文件。金宝app进入这一层,打开生活的脚本示例。

filterSize = 5;numFilters = 64;numLatentInputs = 100;projectionSize = (512 4);layersGenerator = [featureInputLayer (numLatentInputs) projectAndReshapeLayer (projectionSize) transposedConv2dLayer (filterSize 4 * numFilters) batchNormalizationLayer reluLayer transposedConv2dLayer (2 * numFilters filterSize,跨步= 2,裁剪=“相同”)batchNormalizationLayer reluLayer transposedConv2dLayer (filterSize numFilters,跨步= 2,裁剪=“相同”)batchNormalizationLayer reluLayer transposedConv2dLayer (filterSize 3步= 2,裁剪=“相同”)tanhLayer);

训练网络使用一个自定义训练循环和启用自动分化、转换层图dlnetwork对象。

netG = dlnetwork (layersGenerator);

定义鉴别器网络

定义以下网络,把真实和64 -,- 64图像生成。

创建一个网络,需要64 -通过- 64 - 3图片和返回一个标量预测分数使用一系列的卷积层批规范化和漏ReLU层。添加噪声与输入图像使用辍学。

  • 辍学的层,指定一个辍学概率为0.5。

  • 对于卷积层,指定5-by-5过滤器与越来越多的过滤器每一层。还指定一个跨步2和填充的输出。

  • 漏水的ReLU层,指定一个规模为0.2。

  • 输出的概率区间[0,1],指定一个卷积与一个4×4层过滤后乙状结肠层。

dropoutProb = 0.5;numFilters = 64;规模= 0.2;inputSize = (64 64 3);filterSize = 5;layersDiscriminator = [imageInputLayer (inputSize正常化=“没有”)dropoutLayer (dropoutProb) convolution2dLayer (filterSize numFilters,跨步= 2,填充=“相同”)leakyReluLayer(规模)convolution2dLayer (2 * numFilters filterSize,跨步= 2,填充=“相同”)batchNormalizationLayer leakyReluLayer(规模)convolution2dLayer (4 * numFilters filterSize,跨步= 2,填充=“相同”)batchNormalizationLayer leakyReluLayer(规模)convolution2dLayer (filterSize 8 * numFilters,跨步= 2,填充=“相同”)batchNormalizationLayer leakyReluLayer(规模)convolution2dLayer (4,1) sigmoidLayer];

训练网络使用一个自定义训练循环和启用自动分化、转换层图dlnetwork对象。

= dlnetwork经济技术开发区(layersDiscriminator);

定义模型的损失函数

创建函数modelLoss中列出,损失函数模型部分的示例中,将作为输入生成器和鉴别器网络,mini-batch输入数据,一个随机值数组,和不利因素,并返回值损失,损失值的梯度对可学的网络参数,发电机状态,和两个网络的分数。

指定培训选项

火车mini-batch大小为128 500时代。对于更大的数据集,您可能不需要训练尽可能多的时代。

numEpochs = 500;miniBatchSize = 128;

指定的选项为亚当的优化。对于两个网络,指定:

  • 学习速率为0.0002

  • 一个梯度衰减系数为0.5

  • 一个平方梯度衰减系数为0.999

learnRate = 0.0002;gradientDecayFactor = 0.5;squaredGradientDecayFactor = 0.999;

如果鉴别器学会区分真正的过快和生成图像,然后生成器可以没有火车。为了更好地平衡学习鉴别器和生成器,添加噪声的实际数据随机切换标签分配给真正的图像。

指定与概率0.35翻转真正的标签。请注意,这并不影响发电机的所有生成的图像仍然正确标示。

flipProb = 0.35;

每100次迭代显示生成的验证图像。

validationFrequency = 100;

火车模型

GAN火车,火车两个网络同时最大化的性能:

  • 火车生成器来生成“傻瓜”鉴别器的数据。

  • 培养鉴别器区分真实和生成数据。

发电机的性能优化,最大化的损失时鉴别器生成的数据。即发电机的目的是生成数据,鉴别器分类“真正的”

优化鉴别器的性能,减少损失的鉴别器当批次的真实和生成数据。即鉴别器的目的是不要被“骗”发电机。

理想情况下,这些策略导致发电机产生令人信服的真实数据和鉴频器已经学会强大特性表征,是训练数据的特征。

使用minibatchqueue处理和管理mini-batches图像。为每个mini-batch:

  • 使用自定义mini-batch预处理功能preprocessMiniBatch(在这个例子中定义)重新调节图像的范围[1]

  • 丢弃任何偏mini-batches观察少于指定mini-batch大小。

  • 格式的图像数据格式“SSCB”(空间、空间、通道、批)。默认情况下,minibatchqueue把数据转换为对象dlarray对象与基本类型

  • 火车在GPU如果一个是可用的。默认情况下,minibatchqueue将每个输出转换为对象gpuArray如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU计算的需求(并行计算工具箱)

augimds。MiniBatchSize = MiniBatchSize;兆贝可= minibatchqueue (augimds,MiniBatchSize = MiniBatchSize,PartialMiniBatch =“丢弃”,MiniBatchFcn = @preprocessMiniBatch,MiniBatchFormat =“SSCB”);

火车模型使用自定义训练循环。循环训练数据和更新网络参数在每个迭代。监控培训进展,显示生成一批图像使用了随机值的数组输入生成器以及情节的分数。

初始化参数为亚当的优化。

trailingAvgG = [];trailingAvgSqG = [];trailingAvg = [];trailingAvgSqD = [];

监控培训进展,显示生成一批图像使用了一批固定的随机向量送入发生器和情节网络分数。

创建一个数组伸出的随机值。

numValidationImages = 25;ZValidation = randn (numLatentInputs numValidationImages,“单身”);

将数据转换为dlarray对象和指定的格式“CB”(频道,批处理)。

ZValidation = dlarray (ZValidation,“CB”);

GPU培训,将数据转换为gpuArray对象。

如果canUseGPU ZValidation = gpuArray (ZValidation);结束

初始化培训进展的情节。创建一个图,并调整其宽度的两倍。

f =图;f.Position (3) = 2 * f.Position (3);

创建一个次要情节为生成的图像和网络的分数。

imageAxes =情节(1、2、1);scoreAxes =情节(1、2、2);

初始化分数的动画线条图。

C = colororder;lineScoreG = animatedline (scoreAxes颜色= C (1:));lineScoreD = animatedline (scoreAxes颜色= C (2:));传奇(“发电机”,“鉴频器”);ylim([0 1])包含(“迭代”)ylabel (“分数”网格)

训练甘。对于每一个时代,洗牌的数据存储和遍历mini-batches数据。

为每个mini-batch:

  • 评估损失的梯度对可学的参数、发电机状态,和网络使用dlfevalmodelLoss函数。

  • 更新网络参数使用adamupdate函数。

  • 的两个网络的阴谋。

  • 在每一个validationFrequency迭代,显示生成一批图像固定伸出发电机输入。

培训可以花费一些时间来运行。

迭代= 0;开始=抽搐;%循环时期。时代= 1:numEpochs%重置和洗牌数据存储。洗牌(兆贝可);%在mini-batches循环。hasdata(兆贝可)迭代=迭代+ 1;% mini-batch读取的数据。X =下一个(兆贝可);%为发电机网络生成潜在的输入。转换为% dlarray和指定格式“CB”(频道,批处理)。如果一个GPU%,然后把潜在gpuArray输入。Z = randn (numLatentInputs miniBatchSize,“单身”);Z = dlarray (Z,“CB”);如果canUseGPU Z = gpuArray (Z);结束%的梯度评估损失的可学的%参数、发电机状态和网络使用% dlfeval和modelLoss函数。[~,~,gradientsG、gradientsD stateG, scoreG,得分)=dlfeval (@modelLoss netG,经济技术开发区X, Z, flipProb);netG。状态= stateG;%更新鉴别器网络参数。[,经济技术开发区trailingAvg trailingAvgSqD] = adamupdate(,经济技术开发区gradientsD,trailingAvg trailingAvgSqD,迭代,learnRate、gradientDecayFactor squaredGradientDecayFactor);%更新发电机网络参数。[netG, trailingAvgG trailingAvgSqG] = adamupdate (netG gradientsG,trailingAvgG trailingAvgSqG,迭代,learnRate、gradientDecayFactor squaredGradientDecayFactor);%每个validationFrequency迭代,显示生成的批处理%使用了发生器的输入图像。如果国防部(迭代,validationFrequency) = = 0 | |迭代= = 1%使用伸出生成器生成图像的输入。XGeneratedValidation =预测(netG ZValidation);%的瓷砖和重新调节图像的范围(0 - 1)。我= imtile (extractdata (XGeneratedValidation));I =重新调节(我);%显示图像。次要情节(1、2、1);图像(imageAxes,我)xticklabels ([]);yticklabels ([]);标题(“生成的图像”);结束%更新分数阴谋。次要情节(1、2、2)scoreG =双(extractdata (scoreG));addpoints (lineScoreG迭代,scoreG);得分=双(extractdata(得分));addpoints (lineScoreD迭代,得分);%更新标题与培训进展信息。D =持续时间(0,0,toc(开始),格式=“hh: mm: ss”);标题(”时代:“+时代+”、“+“迭代:“+迭代+”、“+”经过:“+ drawnow字符串(D))结束结束

这里,鉴别器已经学会了强大特性表征,确定真实图像生成的图像。反过来,发电机已经学会了同样强大的功能表示,允许它来生成图像类似于训练数据。

发电机的训练图显示了分数和鉴别器网络。了解更多关于如何解释网络分数,看看监测GAN培训进展并确定常见的失效模式

生成新的图片

生成新的图像,使用预测函数发生器和一个dlarray对象包含一批随机向量。一起来显示图像,使用imtile使用功能和调节图像重新调节函数。

创建一个dlarray对象包含一批25个随机向量生成器的输入网络。

numObservations = 25;ZNew = randn (numLatentInputs numObservations,“单身”);ZNew = dlarray (ZNew,“CB”);

如果一个GPU是可用的,然后把潜在的向量gpuArray

如果canUseGPU ZNew = gpuArray (ZNew);结束

使用生成新的图像预测函数发生器和输入数据。

XGeneratedNew =预测(netG ZNew);

显示图像。

我= imtile (extractdata (XGeneratedNew));I =重新调节(我);数字图像(I)轴标题(“生成的图像”)

损失函数模型

这个函数modelLoss需要作为输入生成器和鉴频器dlnetwork对象netGnetDmini-batch的输入数据X,一个随机值数组Z的概率,把真正的标签flipProb,并返回值损失,损失值的梯度对可学的网络参数,发电机状态,和两个网络的分数。

函数[lossG, lossD gradientsG、gradientsD stateG, scoreG,得分)=modelLoss (netG,经济技术开发区X, Z, flipProb)%计算实际数据与鉴别器网络的预测。YReal =前进,经济技术开发区(X);%计算生成的预测数据与鉴频器%网络。向前(XGenerated stateG] = (netG, Z);YGenerated =前进(,经济技术开发区XGenerated);%计算分数的鉴别器。得分=(意思(YReal) + (1-YGenerated)) / 2;%计算发电机的分数。scoreG =意味着(YGenerated);%随机翻转真实图像的标签。numObservations =大小(YReal 4);numObservations idx =兰德(1)< flipProb;YReal (:,:,:, idx) = 1 - YReal (:,:,:, idx);甘%计算损失。[lossG, lossD] = ganLoss (YReal YGenerated);%为每个网络,计算梯度的损失。gradientsG = dlgradient (lossG、netG.Learnables RetainData = true);gradientsD = dlgradient (lossD netD.Learnables);结束

氮化镓损失函数和分数

发电机的目的是生成数据,鉴别器分类“真正的”。最大化图像生成器的概率被归类为真正的鉴别器,减少负对数似然函数。

考虑到输出 Y 鉴频器:

  • Y 的概率是输入图像属于类“真正的”

  • 1 - - - - - - Y 的概率是输入图像属于类“生成”

的损失函数发生器是由

lossGenerator = - - - - - - 的意思是 ( 日志 ( Y 生成的 ) ) ,

在哪里 Y G e n e r 一个 t e d 包含生成的图像的鉴频器的输出概率。

鉴频器的目的是不要被“骗”发电机。的概率最大化之间的鉴别器成功地歧视真正的和生成的图像,减少相应的负对数似然函数的总和。

鉴频器的损失函数是由

lossDiscriminator = - - - - - - 的意思是 ( 日志 ( Y 真正的 ) ) - - - - - - 的意思是 ( 日志 ( 1 - - - - - - Y 生成的 ) ) ,

在哪里 Y R e 一个 l 包含真正的图像的鉴频器的输出概率。

衡量规模从0到1的发电机和鉴别器实现各自的目标,你可以用分数的概念。

发电机分数的平均概率对应的鉴频器输出生成的图片:

scoreGenerator = 的意思是 ( Y 生成的 )

鉴别器分数的平均概率对应的鉴频器输出真正的和生成的图像:

scoreDiscriminator = 1 2 的意思是 ( Y 真正的 ) + 1 2 的意思是 ( 1 - - - - - - Y 生成的 )

比分是成反比的损失但有效地包含相同的信息。

函数[lossG, lossD] = ganLoss (YReal YGenerated)%计算鉴别器网络的损失。lossD =意味着(日志(YReal))——意味着(日志(1-YGenerated));%计算发电机网络的损失。lossG =意味着(日志(YGenerated));结束

Mini-Batch预处理功能

preprocessMiniBatch使用以下步骤:预处理数据函数

  1. 提取图像数据从传入单元阵列和连接到一个数字数组。

  2. 重新将图像的范围内[1]

函数X = preprocessMiniBatch(数据)%连接mini-batchX =猫(4、数据{:});%重新的图像范围内[1]。X =重新调节(X, 1, 1, InputMin = 0, InputMax = 255);结束

引用

  1. TensorFlow团队。http://download.tensorflow.org/example_images/flower_photos.tgz

  2. 雷德福,亚历克,路加梅斯,Soumith Chintala。”无监督学习表示卷积生成地对抗的网络。2015年11月19日,“预印本,提交。http://arxiv.org/abs/1511.06434。

另请参阅

|||||||

相关的话题