主要内容

火车条件生成对抗网络(CGAN)

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

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

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

  1. 发电机,给定一个向量随机值作为输入,该网络生成数据具有相同结构作为训练数据。

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

一个有条件的生成对抗网络(CGAN)是一种氮化镓,也在培训过程中利用标签。

  1. 发电机,给定一个标签和随机数组作为输入,这个网络生成数据作为训练数据结构相同的观测对应相同的标签。

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

甘训练条件、训练两个网络同时最大化的性能:

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

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

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

鉴频器的性能最大化,最小化损失鉴别器当批次的真正的和生成的标记数据。即鉴别器的目的是不要被“骗”发电机。

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

负荷训练数据

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

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

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

datasetFolder = fullfile (imageFolder);imd = imageDatastore (datasetFolder IncludeSubfolders = true, LabelSource =“foldernames”);

视图类的数量。

类=类别(imds.Labels);numClasses =元素个数(类)
numClasses = 5

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

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

定义发电机网络

定义以下两个输入网络,生成图像随机向量的大小100和相应的标签。

这个网络:

  • 将随机向量的大小100 - 4 -通过- 4 - 1024阵列使用一个完全连接层,后跟一个重塑手术。

  • 将分类标签嵌入向量并重塑了他们一个4×4数组。

  • 连接的两个输入沿着通道尺寸的照片。输出是一个4 - - 4 - 1025的数组。

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

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

  • 对于分类的输入,使用50的嵌入维数。

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

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

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

项目和重塑噪声输入,使用一个完全连接层,后跟一个重塑操作specifed作为层与函数的函数feature2image功能,附加到这个例子作为支持文件。金宝app嵌入的分类标签,使用自定义层embeddingLayer这个例子作为支持文件。金宝app要访问这些支持文件,打开生活的脚金宝app本示例。

numLatentInputs = 100;embeddingDimension = 50;numFilters = 64;filterSize = 5;projectionSize = (1024 4);layersGenerator = [featureInputLayer (numLatentInputs) fullyConnectedLayer (prod (projectionSize)) functionLayer (@ (X) feature2image (X, projectionSize) Formattable = true) concatenationLayer(3 2名=“猫”);transposedConv2dLayer (filterSize 4 * numFilters) batchNormalizationLayer reluLayer transposedConv2dLayer (2 * numFilters filterSize,跨步= 2,裁剪=“相同”)batchNormalizationLayer reluLayer transposedConv2dLayer (filterSize numFilters,跨步= 2,裁剪=“相同”)batchNormalizationLayer reluLayer transposedConv2dLayer (filterSize 3步= 2,裁剪=“相同”)tanhLayer);lgraphGenerator = layerGraph (layersGenerator);层= [featureInputLayer (1) embeddingLayer (embeddingDimension numClasses) fullyConnectedLayer (prod (projectionSize (1:2))) functionLayer (@ (X) feature2image (X, [projectionSize (1:2) 1]), Formattable = true, Name =“emb_reshape”));lgraphGenerator = addLayers (lgraphGenerator层);lgraphGenerator = connectLayers (lgraphGenerator,“emb_reshape”,“猫/ in2”);

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

dlnetGenerator = dlnetwork (lgraphGenerator)
dlnetGenerator = dlnetwork属性:层:[19×1 nnet.cnn.layer.Layer]连接:[18×2表]可学的:[19×3表)状态:[6×3表]InputNames:{“输入”“input_1”} OutputNames: {“layer_2”}初始化:1

定义鉴别器网络

定义以下两个输入网络,把真实和64 -,- 64图像生成给定一组图片和相应的标签。

创建一个网络作为输入64 -通过- 64 - 1图像和相应的标签和输出一个标量预测分数使用一系列的卷积层批规范化和漏ReLU层。添加噪声与输入图像使用辍学。

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

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

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

  • 对于最后一层,指定一个卷积层用一个4×4过滤器。

dropoutProb = 0.75;numFilters = 64;规模= 0.2;inputSize = (64 64 3);filterSize = 5;layersDiscriminator = [imageInputLayer (inputSize正常化=“没有”)dropoutLayer (dropoutProb) concatenationLayer(3 2名=“猫”)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)];lgraphDiscriminator = layerGraph (layersDiscriminator);层= [featureInputLayer (1) embeddingLayer (embeddingDimension numClasses) fullyConnectedLayer (prod (inputSize (1:2))) functionLayer (@ (X) feature2image (X, [inputSize (1:2) 1]), Formattable = true, Name =“emb_reshape”));lgraphDiscriminator = addLayers (lgraphDiscriminator层);lgraphDiscriminator = connectLayers (lgraphDiscriminator,“emb_reshape”,“猫/ in2”);

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

dlnetDiscriminator = dlnetwork (lgraphDiscriminator)
dlnetDiscriminator = dlnetwork属性:层:[19×1 nnet.cnn.layer.Layer]连接:[18×2表]可学的:[19×3表)状态:[6×3表]InputNames: {“imageinput”“输入”}OutputNames: {“conv_5”}初始化:1

定义模型梯度和损失函数

创建函数modelGradients中列出,模型梯度函数部分的示例中,将作为输入生成器和鉴别器网络,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;

每100次迭代更新培训进展的阴谋。

validationFrequency = 100;

如果鉴别器学会区分真正的过快和生成图像,然后生成器可以没有火车。为了更好地平衡学习鉴别器和生成器,随机翻转的标签部分的真实图像。指定一个翻0.5倍。

flipFactor = 0.5;

火车模型

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

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

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

  • 丢弃任何偏mini-batches少于128的观察。

  • 格式的图像数据维度标签“SSCB”(空间、空间、通道、批)。

  • 标签格式标签数据的维度“公元前”(批处理、通道)。

  • 火车在GPU如果一个是可用的。当OutputEnvironment选择minibatchqueue“汽车”,minibatchqueue将每个输出转换为gpuArray如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU的金宝app支持版本(并行计算工具箱)

minibatchqueue对象,默认情况下,将数据转换为dlarray对象与基本类型

augimds。MiniBatchSize = MiniBatchSize;executionEnvironment =“汽车”;兆贝可= minibatchqueue (augimds,MiniBatchSize = MiniBatchSize,PartialMiniBatch =“丢弃”,MiniBatchFcn = @preprocessData,MiniBatchFormat = [“SSCB”“公元前”),OutputEnvironment = executionEnvironment);

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

velocityDiscriminator = [];trailingAvgGenerator = [];trailingAvgSqGenerator = [];trailingAvgDiscriminator = [];trailingAvgSqDiscriminator = [];

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

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

创建分数的次要情节生成的图像和阴谋。

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

初始化分数情节动画线条。

lineScoreGenerator = animatedline (scoreAxes颜色= 0.447 - 0.741 [0]);lineScoreDiscriminator = animatedline (scoreAxes颜色= [0.85 0.325 0.098]);

定制的外观图。

传奇(“发电机”,“鉴频器”);ylim([0 1])包含(“迭代”)ylabel (“分数”网格)

监控培训进展,创造了一批25个随机向量和一组相应的标签1到5(对应于类)重复五次。

numValidationImagesPerClass = 5;ZValidation = randn (numLatentInputs numValidationImagesPerClass * numClasses,“单身”);TValidation =单(repmat (1: numClasses, [1 numValidationImagesPerClass]));

将数据转换为dlarray对象和指定尺寸标签“CB”(频道,批处理)。

dlZValidation = dlarray (ZValidation,“CB”);dlTValidation = dlarray (TValidation,“CB”);

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

如果(executionEnvironment = =“汽车”& & canUseGPU) | | executionEnvironment = =“图形”dlZValidation = gpuArray (dlZValidation);dlTValidation = gpuArray (dlTValidation);结束

培养条件着手。对于每一个时代,洗牌和遍历mini-batches数据的数据。

为每个mini-batch:

  • 评估模型梯度使用dlfevalmodelGradients函数。

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

  • 的两个网络的阴谋。

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

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

迭代= 0;开始=抽搐;%循环时期。时代= 1:numEpochs%重置和洗牌数据。洗牌(兆贝可);%在mini-batches循环。hasdata(兆贝可)迭代=迭代+ 1;% mini-batch读取的数据。[dlX, dlT] =下一个(兆贝可);%为发电机网络生成潜在的输入。转换为% dlarray和指定尺寸标签“CB”(频道,批处理)。%如果训练在GPU,然后把潜在gpuArray输入。Z = randn (numLatentInputs miniBatchSize,“单身”);dlZ = dlarray (Z,“CB”);如果(executionEnvironment = =“汽车”& & canUseGPU) | | executionEnvironment = =“图形”dlZ = gpuArray (dlZ);结束%评估模型梯度和发电机状态使用% dlfeval modelGradients函数结束时上市%的例子。[gradientsGenerator, gradientsDiscriminator stateGenerator、scoreGenerator scoreDiscriminator] =dlfeval (@modelGradients、dlnetGenerator dlnetDiscriminator、dlX dlT, dlZ, flipFactor);dlnetGenerator。状态= stateGenerator;%更新鉴别器网络参数。[dlnetDiscriminator, trailingAvgDiscriminator trailingAvgSqDiscriminator] =adamupdate (dlnetDiscriminator gradientsDiscriminator,trailingAvgDiscriminator trailingAvgSqDiscriminator,迭代,learnRate、gradientDecayFactor squaredGradientDecayFactor);%更新发电机网络参数。[dlnetGenerator, trailingAvgGenerator trailingAvgSqGenerator] =adamupdate (dlnetGenerator gradientsGenerator,trailingAvgGenerator trailingAvgSqGenerator,迭代,learnRate、gradientDecayFactor squaredGradientDecayFactor);%每个validationFrequency迭代,显示使用批生成图像%伸出发电机输入。如果国防部(迭代,validationFrequency) = = 0 | |迭代= = 1%使用伸出生成器生成图像的输入。dlXGeneratedValidation =预测(dlnetGenerator dlZValidation dlTValidation);%的瓷砖和重新调节图像的范围(0 - 1)。我= imtile (extractdata (dlXGeneratedValidation),GridSize = [numValidationImagesPerClass numClasses]);I =重新调节(我);%显示图像。次要情节(1、2、1);图像(imageAxes,我)xticklabels ([]);yticklabels ([]);标题(“生成的图像”);结束%更新分数阴谋。次要情节(1、2、2)addpoints (lineScoreGenerator,迭代,双(收集(extractdata (scoreGenerator))));addpoints (lineScoreDiscriminator迭代,双(收集(extractdata (scoreDiscriminator))));%更新标题与培训进展信息。D =持续时间(0,0,toc(开始),格式=“hh: mm: ss”);标题(”时代:“+时代+”、“+“迭代:“+迭代+”、“+”经过:“+ drawnow字符串(D))结束结束

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

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

生成新的图片

生成一个特定类的新图像,使用预测函数发生器和一个dlarray对象包含一批随机向量和一组标签对应于所需的类。将数据转换为dlarray对象和指定尺寸标签“CB”(频道,批处理)。GPU的预测,将数据转换为gpuArray对象。一起来显示图像,使用imtile使用功能和调节图像重新调节函数。

创建一个数组的36个向量随机值对应于第一节课。

numObservationsNew = 36;idxClass = 1;Z = randn (numLatentInputs numObservationsNew,“单身”);T = repmat(单(idxClass) [1 numObservationsNew]);

将数据转换为dlarray维的对象标签“SSCB”(空间、空间、通道、批处理)。

dlZ = dlarray (Z,“CB”);dlT = dlarray (T)“CB”);

使用GPU生成图像,也将数据转换为gpuArray对象。

如果(executionEnvironment = =“汽车”& & canUseGPU) | | executionEnvironment = =“图形”dlZ = gpuArray (dlZ);dlT = gpuArray (dlT);结束

生成图像使用预测函数发生器网络。

dlXGenerated =预测(dlnetGenerator, dlZ dlT);

显示生成的图像在一个阴谋。

图我= imtile (extractdata (dlXGenerated));I =重新调节(我);imshow (I)标题(”类:“+类(idxClass))

在这里,发电机网络条件指定的类生成图像。

模型梯度函数

这个函数modelGradients需要作为输入生成器和鉴频器dlnetwork对象dlnetGeneratordlnetDiscriminatormini-batch的输入数据dlX,相应的标签dlT和一个随机值数组dlZ的梯度,并返回损失对可学的网络参数,发电机状态,和网络的分数。

如果鉴别器学会区分真正的过快和生成图像,然后生成器可以没有火车。为了更好地平衡学习鉴别器和生成器,随机翻转的标签部分的真实图像。

函数[gradientsGenerator, gradientsDiscriminator stateGenerator、scoreGenerator scoreDiscriminator] =modelGradients (dlnetGenerator dlnetDiscriminator、dlX dlT, dlZ, flipFactor)%计算实际数据与鉴别器网络的预测。向前dlYPred = (dlnetDiscriminator dlX dlT);%计算生成的预测数据与鉴别器网络。[dlXGenerated, stateGenerator] =前进(dlnetGenerator, dlZ dlT);向前dlYPredGenerated = (dlnetDiscriminator dlXGenerated dlT);%计算概率。probGenerated =乙状结肠(dlYPredGenerated);probReal =乙状结肠(dlYPred);%计算发电机和鉴频器的分数。scoreGenerator =意味着(probGenerated);scoreDiscriminator =(意思(probReal) + (1-probGenerated)) / 2;%翻转标签。numObservations =大小(dlYPred 4);idx = randperm (numObservations、地板(flipFactor * numObservations));probReal (:,:,:, idx) = 1 - probReal (:,:,:, idx);甘%计算损失。[lossGenerator, lossDiscriminator] = ganLoss (probReal probGenerated);%为每个网络,计算梯度的损失。gradientsGenerator = dlgradient (lossGenerator、dlnetGenerator.Learnables RetainData = true);gradientsDiscriminator = dlgradient (lossDiscriminator dlnetDiscriminator.Learnables);结束

氮化镓损失函数

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

考虑到输出 Y 鉴频器:

  • Y ˆ = σ ( Y ) 的概率是输入图像属于类“真正的”

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

注意乙状结肠操作 σ 发生在modelGradients函数。的损失函数发生器是由

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

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

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

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

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

函数[lossGenerator, lossDiscriminator] = ganLoss (scoresReal scoresGenerated)%计算损失的鉴别器网络。lossGenerated =意味着(日志(1 - scoresGenerated));lossReal =意味着(日志(scoresReal));%结合鉴别器网络的损失。lossDiscriminator = lossReal + lossGenerated;%计算发电机网络的损失。lossGenerator =意味着(日志(scoresGenerated));结束

Mini-Batch预处理功能

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

  1. 提取图像和标签数据从输入单元数组和连接到数字数组。

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

函数[X, T] = preprocessData(伊势亚TCell)%从细胞中提取图像数据和连接猫(X = 4,伊势亚{:});%从细胞中提取标签数据和连接猫(T = 1, TCell {:});%重新的图像范围内[1]。X =重新调节(X, 1, 1, InputMin = 0, InputMax = 255);结束

引用

另请参阅

||||||

相关的话题