主要内容

火车变分Autoencoder (VAE)来生成图像

这个例子展示了如何训练深度学习变分autoencoder (VAE)来生成图像。

生成的数据强烈表示观察收集的数据,您可以使用一个变分autoencoder。autoencoder是一种模型训练来复制其输入的输入转换为一个低维空间(编码步骤)和重建低维表示的输入(解码步骤)。

这个图表说明了基本结构的autoencoder重建图像的数字。

使用变分autoencoder生成新的图像,输入随机向量解码器。

一个变分autoencoder与常规autoencoder的不同之处在于,它对潜在的空间概率分布,并学习分布,译码器的输出观测数据的匹配。特别是,潜在的输出是随机抽样分布学的编码器。

下面的例子使用了MNIST数据集[1]包含60000灰度级图像的手写数字10000年培训和图像进行测试。

加载数据

下载的培训和测试MNIST文件http://yann.lecun.com/exdb/mnist/并提取图像使用processImagesMNIST函数附加到这个例子作为支持文件。金宝app访问这个函数,打开这个例子作为一个活的脚本。我们不需要带安全标签的数据。

trainImagesFile =“train-images-idx3-ubyte.gz”;testImagesFile =“t10k-images-idx3-ubyte.gz”;XTrain = processImagesMNIST (trainImagesFile);
读MNIST图像数据……数据集的图像数量:60000…
XTest = processImagesMNIST (testImagesFile);
读MNIST图像数据……数据集的图像数量:10000…

定义网络体系结构

Autoencoders有两个部分:编码器和译码器。编码器接受图像输入和输出(编码)使用潜在的向量表示一系列downsampling旋转等操作。同样,解码器将作为输入的向量表示,并重建的输入使用一系列upsampling转置运算等操作。

样本的输入,示例使用自定义层samplingLayer。进入这一层,打开这个例子作为一个活的脚本。层取平均值作为输入向量 μ 连接与log-variance向量 日志 ( σ 2 ) 和样品的元素 N ( μ , σ 2 ) 。层使用log-variance数值使训练过程更加稳定。

定义编码器网络体系结构

定义以下编码器网络downsamples 28-by-28-by-1图像16-by-1潜在的向量。

  • 图像输入,指定一个图像输入层与输入训练数据匹配的大小。不正常的数据。

  • downsample输入,指定两块二维卷积和ReLU层。

  • 输出连接向量的手段和log-variances,指定一个完全连接层与输出通道数的两倍数量的潜在通道。

  • 样一个指定的编码统计,包括抽样层使用自定义层samplingLayer。进入这一层,打开这个例子作为一个活的脚本。

numLatentChannels = 16;图象尺寸= [28 28 1];layersE = [imageInputLayer(图象尺寸归一化=“没有”32岁的)convolution2dLayer(3填充=“相同”步= 2)reluLayer convolution2dLayer(64,填充=“相同”步= 2)reluLayer fullyConnectedLayer (2 * numLatentChannels) samplingLayer];

定义译码器网络体系结构

定义以下编码器网络从16-by-1潜伏28-by-28-by-1图象重构向量。

  • 特征向量输入,指定一个特性输入层与输入大小匹配潜在渠道的数量。

  • 项目和重塑的输入7 -通过- 7 - 64数组使用自定义层projectAndReshapeLayer附加到这个例子作为支持文件。金宝app进入这一层,打开生活的脚本示例。指定一个投影的大小(64 7)

  • upsample输入,指定两个街区的转置卷积和ReLU层。

  • 输出的图像大小28-by-28-by-1,包括转置卷积层用一个3×3过滤器。

  • 输出映射到区间[0,1]中的值,包括乙状结肠活化层。

projectionSize = (64 7);numInputChannels =大小(图象尺寸,1);layersD = [featureInputLayer (numLatentChannels) projectAndReshapeLayer (projectionSize numLatentChannels) transposedConv2dLayer(64,裁剪=“相同”步= 2)reluLayer transposedConv2dLayer(3 32裁剪=“相同”步= 2)reluLayer transposedConv2dLayer (3 numInputChannels裁剪=“相同”)sigmoidLayer);

列车网络使用一个定制的培训循环和启用自动分化、转换层数组dlnetwork对象。

netE = dlnetwork (layersE);= dlnetwork经济技术开发区(layersD);

定义模型损失函数

定义一个函数,它返回的梯度模型损失和损失对可学的参数。

modelLoss函数,定义的损失函数模型部分的示例中,将作为输入编码器和译码器网络和mini-batch输入数据,并返回损失和损失的梯度对可学的网络参数。计算损失,函数使用ELBOloss函数,定义的ELBO损失函数部分的示例中,需要输入均值和log-variances输出的编码器,并使用它们来计算下界的证据(ELBO)损失。

指定培训选项

火车30时代mini-batch大小为128和学习速率为0.001。

numEpochs = 30;miniBatchSize = 128;learnRate = 1 e - 3;

火车模型

火车模型使用自定义训练循环。

创建一个minibatchqueue对象流程和管理mini-batches图像在训练。为每个mini-batch:

  • 将训练数据转换为数据存储数组。指定迭代第四维度。

  • 使用自定义mini-batch预处理功能preprocessMiniBatch(在这个例子中定义)来连接多个观测到一个mini-batch。

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

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

  • 确保所有mini-batches是相同的大小,丢弃任何部分mini-batches。

dsTrain = arrayDatastore (XTrain IterationDimension = 4);numOutputs = 1;兆贝可= minibatchqueue (dsTrain numOutputs,MiniBatchSize = MiniBatchSize,MiniBatchFcn = @preprocessMiniBatch,MiniBatchFormat =“SSCB”,PartialMiniBatch =“丢弃”);

初始化培训进展阴谋。

图C = colororder;lineLossTrain = animatedline(颜色= C (2:));ylim([0正])包含(“迭代”)ylabel (“损失”网格)

亚当的初始化参数解算器。

trailingAvgE = [];trailingAvgSqE = [];trailingAvgD = [];trailingAvgSqD = [];

列车网络使用自定义训练循环。对于每一个时代,洗牌和遍历mini-batches数据的数据。为每个mini-batch:

  • 评估损失和梯度模型使用dlfevalmodelLoss功能。

  • 更新编码器和解码器使用的网络参数adamupdate函数。

  • 显示培训进展。

迭代= 0;开始=抽搐;%循环时期。时代= 1:numEpochs%洗牌数据。洗牌(兆贝可);%在mini-batches循环。hasdata(兆贝可)迭代=迭代+ 1;% mini-batch读取的数据。X =下一个(兆贝可);%评估损失和梯度。(损失、gradientsE gradientsD] = dlfeval (@modelLoss netE,,经济技术开发区X);%更新可学的参数。[netE, trailingAvgE trailingAvgSqE] = adamupdate (netE,gradientsE、trailingAvgE trailingAvgSqE,迭代,learnRate);[,经济技术开发区trailingAvgD trailingAvgSqD] = adamupdate(,经济技术开发区gradientsD、trailingAvgD trailingAvgSqD,迭代,learnRate);%显示培训进展。D =持续时间(0,0,toc(开始),格式=“hh: mm: ss”);损失=双(extractdata(亏损));addpoints (lineLossTrain、迭代、失去)标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束

测试网络

测试的训练autoencoder伸出测试集。创建一个mini-batch队列的数据为训练数据使用相同的步骤,除了不丢弃任何部分mini-batches数据。

dst = arrayDatastore (XTest IterationDimension = 4);numOutputs = 1;numOutputs mbqTest = minibatchqueue (dst,MiniBatchSize = MiniBatchSize,MiniBatchFcn = @preprocessMiniBatch,MiniBatchFormat =“SSCB”);

使用训练autoencoder使用作出预测modelPredictions函数。

欧美= modelPredictions (netE,经济技术开发区mbqTest);

可视化重建误差的均方误差的测试图像和重建图像直方图和可视化。

呃=意味着((XTest-YTest)。(1 2 3)^ 2);图直方图(err)包含(“错误”)ylabel (“频率”)标题(“测试数据”)

生成新的图片

产生了一批新的图像通过随机采样图像编码解码器。

numImages = 64;ZNew = randn (numLatentChannels numImages);ZNew = dlarray (ZNew,“CB”);YNew =预测(,经济技术开发区ZNew);YNew = extractdata (YNew);

图中显示生成的图像。

图我= imtile (YNew);imshow (I)标题(“生成的图像”)

这里,VAE获悉一个强大的特性表示,允许它来生成图像类似于训练数据。

辅助函数

损失函数模型

modelLoss函数作为输入编码器和译码器网络和mini-batch输入数据,并返回损失和损失的梯度对可学的网络参数。函数通过训练图像通过编码器,并将生成的图像编码解码器。计算损失,函数使用elboLoss函数的均值和log-variance抽样层编码器输出的统计数据。

函数[损失,gradientsE, gradientsD] = modelLoss (netE,经济技术开发区X)%通过编码器。[Z,μ,logSigmaSq] =前进(netE X);%通过译码器。Y =前进(Z,经济技术开发区);%计算损失和梯度。损失= elboLoss (Y、X,μ,logSigmaSq);[gradientsE, gradientsD] = dlgradient(损失,netE.Learnables netD.Learnables);结束

ELBO损失函数

ELBOloss函数均值和log-variances编码器的输出,并使用它们来计算下界的证据(ELBO)损失。ELBO损失是由两个独立的和损失条款:

ELBO 损失 = 重建 损失 + 吉隆坡 损失

重建的损失衡量关闭解码器输出是输入原采用均方误差(MSE):

重建 损失 = 均方误差 ( 重建 图像 , 输入 图像 )

KL损失或Kullback-Leibler分歧,措施两个概率分布之间的差异。KL损失最小化在这种情况下意味着确保学习均值和方差尽可能接近那些目标(正常)的分布。对于一个潜在的尺寸大小 K ,获得了KL损失

吉隆坡 损失 = - - - - - - 0 5 = 1 K ( 1 + 日志 ( σ 2 ) - - - - - - μ 2 - - - - - - σ 2 )

包括KL损失项的实际效果是包集群学习由于重建损失紧密围绕中心的潜在空间,形成一个连续空间样本。

函数损失= elboLoss (Y, T,μ,logSigmaSq)%重建的损失。reconstructionLoss = mse (Y, T);% KL散度。KL = -0.5 * (1 + logSigmaSq -μ。^ 2 - exp (logSigmaSq), 1);KL =意味着(吉隆坡);%组合的损失。损失= reconstructionLoss + KL;结束

模型的预测函数

modelPredictions函数作为输入编码器和译码器和网络对象minibatchqueue的输入数据兆贝可和计算模型预测的循环遍历所有的数据minibatchqueue对象。

函数Y = modelPredictions (netE,经济技术开发区兆贝可)Y = [];%在mini-batches循环。hasdata(兆贝可)X =(兆贝可);%通过编码器。Z =预测(netE X);%通过dencoder向前。XGenerated =预测,经济技术开发区(Z);%提取和连接的预测。Y, Y =猫(4日extractdata (XGenerated));结束结束

小批预处理功能

preprocessMiniBatch的预测函数进行预处理mini-batch连接输入沿着第四维度。

函数X = preprocessMiniBatch (dataX)%连接。猫(X = 4, dataX {:});结束

参考书目

  1. LeCun (Y。,C. Cortes, and C. J. C. Burges. "The MNIST Database of Handwritten Digits."http://yann.lecun.com/exdb/mnist/

另请参阅

||||||

相关的话题