主要内容

列车堆积的autoencoders用于图像分类

这个例子展示了如何训练堆叠的自动编码器对数字图像进行分类。

具有多个隐藏层的神经网络可以用于解决图像等复杂数据的分类问题。每一层都可以在不同的抽象级别学习特性。然而,在实践中训练具有多个隐藏层的神经网络是很困难的。

一种有效训练多层神经网络的方法是一次只训练一层。您可以通过为每个所需的隐藏层训练一种称为自动编码器的特殊类型的网络来实现这一点。

这个例子展示了如何训练一个有两个隐藏层的神经网络来对图像中的数字进行分类。首先,使用自动编码器以无监督的方式单独训练隐藏层。然后训练一个最终的softmax层,并将这些层连接在一起形成一个堆叠网络,在监督的方式下最后训练一次。

数据集

此示例在整个培训和测试中使用合成数据。通过将随机仿射变换应用于使用不同字体创建的数字图像来生成合成图像。

每个数字图像是28×28像素,有5,000个训练示例。您可以加载培训数据,查看一些图像。

%将训练数据加载到内存中[XtrainImages,TTrain] = DigitTrainCellarrayData;%显示一些训练图像clfI = 1:20 subplot(4,5, I);imshow (xTrainImages{我});结束

图像的标签存储在10×5000矩阵中,其中一个元素的每个列将是1表示数字所属的类,并且列中的所有其他元素将为0.它应该是0注意,如果第十元素为1,则数字图像为零。

训练第一个自动编码器

首先培训训练数据上的稀疏AutoEncoder而不使用标签。

AutoEncoder是一个神经网络,它试图在其输出端复制其输入。因此,其输入的大小与其输出的大小相同。当隐藏层中的神经元数小于输入的大小时,AutoEncoder学习输入的压缩表示。

在培训之前,神经网络的重量随机初始化。因此,训练的结果每次都不同。为避免这种行为,显式设置随机数发生器种子。

RNG('默认'

设置AutoEncoder的隐藏图层的大小。对于您要培训的AutoEncoder,这是一个很好的主意,使得这小于输入大小。

hiddensize1 = 100;

您将训练的autoencoder类型是稀疏的autoencoder。此AutoEncoder使用常规程序在第一层中学习稀疏表示。您可以通过设置各种参数来控制这些正常化器的影响:

  • l2Weightregular化控制L2正则化器对网络权重的影响(而不是偏差)。这通常应该非常小。

  • SparsityRegularization控制稀疏规范器的影响,该影响将尝试对来自隐藏层的输出的稀疏性执行约束。请注意,这与将稀疏规则器应用于权重的不同。

  • 啪量为是稀疏规范器的参数。它控制来自隐藏层的输出的稀疏性。低价值啪量为通常通过仅为少量训练示例提供高输出的隐藏层“专注”中的每个神经元。例如,如果啪量为设置为0.1,这相当于说隐藏层中的每个神经元在训练示例中的平均输出应该是0.1的平均输出。此值必须在0到1之间。理想值根据问题的性质而异。

现在培训AutoEncoder,指定上面描述的常规值的值。

autoenc1 = trainautoencoder(xtrainimages,hiddensize1,......'maxepochs', 400,......'l2weightregularization',0.004,......'sparsityRegularization',4,......“SparsityProportion”, 0.15,......“ScaleData”、假);

您可以查看autoencoder的图表。AutoEncoder由编码器组成,后跟解码器。编码器将输入映射到隐藏表示,并且解码器尝试反转此映射以重建原始输入。

视图(autoenc1)

可视化第一个自动编码器的权重

自动编码器的编码器部分学到的映射可以用于从数据中提取特征。编码器中的每个神经元都有一个与之相关的权值向量,它将被调整以响应特定的视觉特征。您可以查看这些特性的表示。

图()绘图重量(autoenc1);

您可以看到,自动编码器学习的特征代表了数字图像的卷曲和笔画模式。

来自AutoEncoder的隐藏层的100维输出是输入的压缩版本,其总结了其对上面可视化功能的响应。在从训练数据中提取的一组上向上列车上列车下一个autoencoder。首先,您必须使用培训的AutoEncoder中的编码器来生成功能。

feat1 =编码(autoenc1 xTrainImages);

培训第二个autoencoder

在培训第一个AutoEncoder后,您以类似的方式训练第二个AutoEncoder。主要区别在于您使用从第一个autoencoder生成的功能作为第二自动码器中的训练数据。此外,您将隐藏表示的大小降低到50,使得第二自动统计器中的编码器学习输入数据的甚至更小的表示。

hiddenSize2 = 50;autoenc2 = trainAutoencoder (feat1 hiddenSize2,......'maxepochs',100,......'l2weightregularization',0.002,......'sparsityRegularization',4,......“SparsityProportion”,0.1,......“ScaleData”、假);

再次,您可以查看autoencoder的图表看法函数。

视图(autoenc2)

您可以通过从第二个AutoEncoder通过编码器传递上次设置的第二组特征。

feat2 =对编码(autoenc2,feat1);

训练数据中的原始向量有784维。在通过第一个编码器之后,它被缩减到100个维度。在使用第二个编码器后,这又减少到50个维度。现在,您可以训练最后一层将这些50维向量分类为不同的数字类。

训练最终的软墨罩层

训练一个softmax层对50维特征向量进行分类。与自动编码器不同,您可以使用训练数据的标签以受监督的方式训练softmax层。

SoftNet = TrainsoftMaxLayer(Feat2,TTrain,'maxepochs',400);

您可以查看softmax图层的图表看法函数。

视图(softnet)

形成堆叠的神经网络

您已经训练了三个堆叠神经网络的单独组件的隔离。此时,查看您培训的三个神经网络可能是有用的。他们是autoenc1autoenc2, 和softnet

查看(autoenc1)视图(autoenc2)视图(softnet)

如上所述,来自AutoEncoders的编码器已被用于提取特征。您可以将来自AutoEndoders的编码器与SoftMax层一起堆叠,以形成堆叠网络以进行分类。

stackednet = stact(autoenc1,autoenc2,softnet);

您可以查看堆叠网络的图表看法函数。该网络由自编码器和软最大层的编码器组成。

查看(StackedNet)

形成完整的网络后,可以在测试集中计算结果。要使用堆叠网络中的图像,必须将测试图像重塑为一个矩阵。你可以通过叠加图像的列来形成一个向量,然后由这些向量形成一个矩阵。

%获取每个图像中的像素数imageWidth = 28;imageHeight = 28;inputSize = imageWidth * imageHeight;%加载测试图像(xTestImages, tt) = digitTestCellArrayData;%将测试图像转换成向量,并将它们放入一个矩阵中xTest = 0 (inputSize元素个数(xTestImages));i = 1:numel(xTestImages) xTest(:,i) = xTestImages{i}(:);结束

您可以使用混淆矩阵来可视化结果。矩阵右下角正方形中的数字给出了整体的精度。

y = stackednet (xTest);plotconfusion (tt, y);

对堆叠神经网络进行微调

通过在整个多层网络上执行反向计算,可以提高堆叠神经网络的结果。该过程通常被称为微调。

通过监督时尚的培训数据,通过将网络进行微调。在完成此操作之前,您必须将训练图像重新塑造成矩阵,如测试图像所做的那样。

%将训练图像转换成向量,并将它们放入矩阵中xtrain = zeros(输入,numel(xtrainimages));i = 1:numel(xtrainimages)xtrain(:,i)= xtrainimages {i}(:);结束%执行微调stackednet =火车(stackednet xTrain tTrain);

然后使用混淆矩阵再次查看结果。

y = stackednet (xTest);plotconfusion (tt, y);

概括

此示例显示了如何训练堆叠的神经网络,以使用AutoEncoders对图像中的数字进行分类。已经概述的步骤可以应用于其他类似问题,例如分类字母图像,甚至特定类别的对象的甚至小图像。