火车堆叠Autoencoders图像分类
这个例子展示了如何训练堆叠autoencoders对数字图像进行分类。
与多个隐藏层神经网络可以用于解决分类问题和复杂的数据,比如图片。每一层都可以学习特性在不同的抽象层次。然而,训练神经网络与多个隐藏层在实践中是很困难的。
有效地训练的一种方法和多层神经网络训练一次一层。可以通过培训实现这一特殊类型的网络称为autoencoder为每个想要隐藏层。
这个例子向您展示了如何训练神经网络和两个隐藏层对数字图像进行分类。首先你火车隐藏层单独使用autoencoders无监督的方式。然后你训练最后一个softmax层和网络层连接在一起,形成一个堆叠,你火车最后一次以监督的方式。
数据集
这个示例使用合成数据,进行训练和测试。合成图像生成了随机仿射变换应用到数字图像创建使用不同的字体。
每个数字图像28-by-28像素,和有5000个训练的例子。你可以加载训练数据,视图的一些图片。
%的训练数据加载到内存中[xTrainImages, tTrain] = digitTrainCellArrayData;%显示的一些训练图像clf为i = 1:20次要情节(4、5、我);imshow (xTrainImages{我});结束
标签的图片存储在一个10 - - 5000矩阵,在每一列一个元素将1表明数字属于的类,和所有其他元素的列将是0。应该注意的是,如果第十个元素是1,那么数字图像是一个零。
培训第一autoencoder
首先训练在训练数据稀疏autoencoder不使用标签。
一个autoencoder是一个试图复制其输入的神经网络输出。因此,其输入的大小将其输出的大小相同。当隐层神经元的数目小于输入的大小,autoencoder学习的压缩表示输入。
神经网络权重随机初始化前培训。因此每次培训的结果是不同的。为了避免这种行为,显式地设置随机数生成器的种子。
rng (“默认”)
设置autoencoder隐层的大小。的autoencoder你要训练,这是一个好主意让小于输入的大小。
hiddenSize1 = 100;
autoencoder的类型,你会训练是一个稀疏autoencoder。这个autoencoder使用regularizers学习稀疏表示在第一层。你可以控制这些regularizers设置各种参数的影响:
L2WeightRegularization
控制的影响的L2调整网络的权值(而不是偏见)。这通常应该很小。SparsityRegularization
控制稀疏的影响调整,试图强制限制从隐层输出的稀疏。注意,这是不同于应用稀疏调整权重。SparsityProportion
是一个参数的稀疏调整。它控制从隐层输出的稀疏。一个较低的价值SparsityProportion
通常会导致隐层中的每个神经元“专业”,只给少数的高输出训练例子。例如,如果SparsityProportion
设置为0.1,这相当于说,隐层中的每个神经元在训练应该平均产量为0.1的例子。这个值必须在0和1之间。理想的价值取决于问题的性质。
现在火车autoencoder,指定的值regularizers上面描述。
autoenc1 = trainAutoencoder (xTrainImages hiddenSize1,…“MaxEpochs”,400,…“L2WeightRegularization”,0.004,…“SparsityRegularization”4…“SparsityProportion”,0.15,…“ScaleData”、假);
您可以查看图autoencoder。的autoencoder由编码器译码器。编码器的输入映射到一个隐藏的代表,和译码器试图扭转这种映射重构原始输入。
视图(autoenc1)
第一autoencoder可视化的权重
映射由编码器autoencoder的一部分可以学到有用的从数据中提取特征的。编码器中的每个神经元的权重向量与它相关联的将调谐响应特定的视觉特性。你可以查看这些特性的表征。
图()plotWeights (autoenc1);
你可以看到学习的特性autoencoder代表卷发和中风从数字图像模式。
100 -维autoencoder的隐层的输出是输入的一个压缩版本,它总结了应对上述特性可视化。火车上的下一个autoencoder一组向量从训练数据中提取。首先,你必须使用的编码器训练autoencoder生成功能。
feat1 =编码(autoenc1 xTrainImages);
培训第二autoencoder
第一autoencoder训练后,你的火车第二autoencoder以类似的方式。主要的区别在于,您使用生成的特性从第一第二autoencoder autoencoder作为训练数据。同样,你隐藏的大小表示减少到50,所以编码器在第二autoencoder学习的更小的表示输入数据。
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层
火车softmax层对50维特征向量进行分类。不同于autoencoders,火车将softmax层以监督的方式使用训练数据标签。
softnet = trainSoftmaxLayer (feat2 tTrain,“MaxEpochs”,400);
您可以查看图将softmax层的视图
函数。
视图(softnet)
形成一个多层神经网络
你有训练三个独立组件的多层神经网络隔离。在这一点上,它可能是有用的视图的三种神经网络训练。他们是autoenc1
,autoenc2
,softnet
。
视图(autoenc1)
视图(autoenc2)
视图(softnet)
就像解释说,从autoencoders编码器被用来提取特征。堆栈的编码器可以autoencoders一起将softmax层形成一个多层网络分类。
stackednet =堆栈(autoenc1 autoenc2 softnet);
您可以查看图的多层网络视图
函数。网络是由从autoencoders编码器,将softmax层。
视图(stackednet)
形成完整的网络,你可以计算测试集的结果。使用图像的多层网络,必须重塑测试图像到一个矩阵。这可以通过叠加图像形成的列向量,然后形成一个矩阵向量。
%在每个图像像素的数量imageWidth = 28;imageHeight = 28;inputSize = imageWidth * imageHeight;%负载测试图像(xTestImages, tt) = digitTestCellArrayData;%将测试图像转变成向量,把它们放在一个矩阵xTest = 0 (inputSize元素个数(xTestImages));为i = 1:元素个数(xTestImages) xTest (:, i) = xTestImages{我}(:);结束
你可以想象结果混淆矩阵。矩阵的数字在右下角广场给整体的精度。
y = stackednet (xTest);plotconfusion (tt, y);
微调多层神经网络
多层神经网络的结果可以提高通过执行整个多层反向传播网络。这个过程通常被称为微调。
你调整网络培训监督的方式训练数据。在这样做之前,你必须重塑训练图像到一个矩阵,作为测试图像了。
%将训练图像转化为向量,把它们放在一个矩阵xTrain = 0 (inputSize元素个数(xTrainImages));为i = 1:元素个数(xTrainImages) xTrain(:,我)= xTrainImages{我}(:);结束%进行微调stackednet =火车(stackednet xTrain tTrain);
你再次查看结果使用混淆矩阵。
y = stackednet (xTest);plotconfusion (tt, y);
总结
这个例子展示了如何训练多层神经网络分类使用autoencoders数字图像。所列出的步骤也适用于其他类似的问题,如分类图片的字母,甚至一个特定类别的小物体的图像。