基于堆叠自编码器(SAE)的图像特征提取与图像分类——附代码

目录

摘要:

一、自动编码器基本概念(Auto-Encoder,AE)

二、堆叠自编码器(SAE)的原理

2.1 第一层AE

2.2 第二层AE

2.3 第三层

2.4 组合

三、具体的实现步骤:

3.1 准备训练数据

3.2 分步训练SAE

3.3 分类结果

4. 本文Matlab代码


摘要:

        基于Matlab平台,构建并训练堆叠自编码器对手写图片进行特征提取,然后使用提取到的图像特征信息对手写图像(0-9的手写数字图)进行识别与分类,并测试其分类的准确度。堆叠自编码器(SAE)具有多个隐含层的神经网络可用于处理复杂数据(例如图像)的分类问题。每个层都可以学习不同抽象级别的特征。然而,在实际工作中,训练具有多个隐含层的神经网络可能会很困难。本文使用一种有效训练具有多个层的神经网络的方法是一次训练一个层。为此,您可以为每个所需的隐含层训练一种称为自编码器的特殊类型的网络。此示例说明如何训练具有两个隐含层的神经网络以对图像中的数字进行分类。首先,使用自编码器以无监督方式单独训练各隐含层。然后训练最终 softmax 层,并将这些层连接在一起形成堆叠网络,该网络最后以有监督方式进行训练。

一、自动编码器基本概念(Auto-Encoder,AE)

        自编码器(autoencoder)是神经网络的一种,经过训练后能尝试将输入复制到输出。自编 码器内部有一个隐藏层h,可以产生编码(code)表示输入。该网络可以看作由两部分组 成:一个由函数h=f(X)表示的编码器和一个生成重构的解码器r=g(h)。我们不应该将自 编码器设计成输入到输出完全相等。这通常需要向自编码器强加一些约束,使它只能近似 地复制,并只能复制与训练数据相似的输入。自动编码机由三层网络组成,其中输入层神经元数量与输出层神经元数量相等,中间层神 经元数量少于输入层和输出层。

        搭建一个自动编码器需要完成下面三样工作:搭建编码器, 搭建解码器,设定一个损失函数,用以衡量由于压缩而损失掉的信息(自编码器是有损的)。编码器和解码器一般都是参数化的方程,并关于损失函数可导,典型情况是使用神经网络。编码器和解码器的参数可以通过最小化损失函数而优化.

        自动编码机(Auto-encoder)是一个自监督的算法,并不是一个无监督算法,它不需要对 训练样本进行标记,其标签产生自输入数据。因此自编码器很容易对指定类的输入训练出 一种特定的编码器,而不需要完成任何新工作。自动编码器是数据相关的,只能压缩那些 与训练数据类似的数据。比如,使用人脸训练出来的自动编码器在压缩别的图片,比如树 木时性能很差,因为它学习到的特征是与人脸相关的。~ 自动编码器运算过程:原始input(设为)经过加权(W、b)、映射(Sigmoid)之后得到 y,再对y反向加权映射回来成为z。通过反复迭代训练两组(W、b),目的就是使输出信 号与输入信号尽量相似。训练结束之后自动编码器可以由两部分组成:

1.输入层和中间层,可以用这个网络来对信号进行压缩

2.中间层和输出层,我们可以将压缩的信号进行还原

二、堆叠自编码器(SAE)的原理

        之前之所以将自编码器模型表示为3层的神经网络,那是因为训练的需要,我们将原始数据作为假想的目标输出,以此构建监督误差来训练整个网络。等训练结束后,输出层就可以去掉了,因为我们只关心的是从(x)到(h)的变换。

        接下来的思路就很自然了,我们已经得到特征表达(h),那么我们可不可以将(h)再作为原始信息,训练一个新的自编码器,得到新的特征表达呢?当软可以,而且这就是所谓的堆叠自编码器(Stacked Autoencoder,SAE)。Stacked就是逐层堆叠的意思,这个跟“栈”有点像。当把多个自编码器Stack起来之后,这个系统看起来就像这样:

2.1 第一层AE

        这样就把自编码器改成了深度结构了,即《learning multiple levels of representation and abstraction》(Hinton, Bengio, LeCun, 2015)。需要注意的是,整个网络的训练不是一蹴而就的,而是逐层进行的。比如说我们要训练一个(n -> m -> k) 结构的网络,实际上我们是先训练网络(n -> m -> n),得到(n -> m)的变换,然后再训练(m -> k -> m)网络,得到(m -> k)的变换。最终堆叠成SAE,即为(n -> m -> k)的结果,整个过程就像一层层往上面盖房子,这就是大名鼎鼎的 layer-wise unsuperwised pre-training (逐层非监督预训练)。

        接下来我们来看一个具体的例子,假设你想要训练一个包含两个隐藏层的堆叠自编码器,用来训练 MNIST 手写数字分类。

        首先,你需要用原始输入(x(k))训练第一个稀疏自编码器中,它能够学习得到原始输入的一阶特征表示(h(1)(k)),如下图所示:

2.2 第二层AE

        接着,你需要把原始数据输入到上述训练好的稀疏自编码器中,对于每一个输入(x(k)),都可以得到它对应的一阶特征表示(h(1)(k))。然后你再用这些一阶特征作为另一个稀疏自编码器的输入,使用它们来学习二阶特征(h(2)(k)),如下图:

2.3 第三层

        同样,再把一阶特征输入到刚训练好的第二层稀疏自编码器中,得到每个(h(1)(k))对应的二阶特征激活值$h(2)(k) $。接下来,你可以把这些二阶特征作为softmax分类器的输入,训练得到一个能将二阶特征映射到数字标签的模型。如下图:

2.4 组合

        最终,你可以将这三层结合起来构建一个包含两个隐藏层和一个最终softmax分类器层的堆叠自编码网络,这个网络能够如你所愿地对MNIST数据集进行分类。最终模型如下图:

三、具体的实现步骤:

3.1 准备训练数据

        此示例始终使用合成数据进行训练和测试。已通过对使用不同字体创建的数字图像应用随机仿射变换来生成合成图像。每个数字图像为 28×28 像素,共有 5000 个训练样本。

3.2 分步训练SAE

        (AE.1):首先在不使用标签的情况下基于训练数据训练稀疏自编码器。自编码器是一种神经网络,该网络会尝试在其输出端复制其输入。因此,其输入的大小将与其输出的大小相同。当隐藏层中的神经元数量小于输入的大小时,自编码器将学习输入的压缩表示。第一个AE的隐含层大小设计为100。

        (AE.2)训练完第一个自编码器后,您需要以相似的方式训练第二个自编码器。主要区别在于您将使用从第一个自编码器生成的特征作为第二个自编码器中的训练数据。此外,您还需要将隐含表示的大小减小到 50,以便第二个自编码器中的编码器学习输入数据的更小表示。

       (分类层)训练 softmax 层以对 50 维特征向量进行分类。与自编码器不同,将使用训练数据的标签以有监督方式训练 softmax 层。

3.3 分类结果

        通过构建测试集的混淆矩阵查看最后的网络分类测试结果,可以看到SAE网络在对手写图像的特征提取后,使得图像识别的分类准确度达到了99.8%,实现了较好的图像分类的效果。

4. 本文Matlab代码

  • 5
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: SAE堆叠自编码器(Stacked Autoencoder, SAE)是一种深度学习网络模型,用于进行无监督学习或特征提取MATLAB是一种流行的科学计算软件,提供了许多功能丰富的工具箱和函数,可以用于实现SAE。 要实现SAEMATLAB代码,首先需要引入相关的工具箱和函数。其中,MATLAB深度学习工具箱是必需的,它包含了用于训练神经网络的功能。 以下是一个简单的SAE MATLAB实现源代码的示例: ```matlab % 导入数据集 load mnist.mat; % 假设mnist.mat包含训练数据集 inputSize = size(trainData, 1); % 设置自编码器的层数和每层的隐藏单元数量 hiddenLayerSizes = [100 50 20]; % 创建SAE网络 sae = saetrain(trainData, hiddenLayerSizes); % 保存训练好的模型 save('sae_model.mat', 'sae'); % 加载模型 load('sae_model.mat'); % 使用SAE进行特征提取 features = encode(sae, testData); % 可以使用得到的特征进行其他任务,如分类 % 实现自编码器训练函数 function sae = saetrain(inputData, hiddenLayerSizes) sae.numLayers = length(hiddenLayerSizes); sae.rbm = cell(1, sae.numLayers); for layer = 1:sae.numLayers if layer == 1 inputSize = size(inputData, 1); outputSize = hiddenLayerSizes(layer); input = inputData; else inputSize = hiddenLayerSizes(layer-1); outputSize = hiddenLayerSizes(layer); input = encode(sae, inputData, layer-1); end sae.rbm{layer} = trainRBM(input, inputSize, outputSize); end end % 实现RBM训练函数 function rbm = trainRBM(inputData, inputSize, hiddenSize) rbm = rbmsetup(inputSize, hiddenSize); rbm = rbmtrain(rbm, inputData); end % 实现RBM设置函数 function rbm = rbmsetup(visNum, hidNum) rbm.visNum = visNum; rbm.hidNum = hidNum; rbm.weights = 0.1 * randn(visNum, hidNum); rbm.vBias = zeros(visNum, 1); rbm.hBias = zeros(hidNum, 1); end % 实现RBM训练函数 function rbm = rbmtrain(rbm, data) rbm = rbmff(rbm, data); rbm = rbmbw(rbm); end % 实现RBM前向传播函数 function rbm = rbmff(rbm, data) rbm.visible = data; rbm.hiddenProb = sigmoid(rbm.visible * rbm.weights + repmat(rbm.hBias', size(data, 1), 1)); rbm.hiddenState = rbm.hiddenProb > rand(size(data, 1), rbm.hidNum); end % 实现RBM反向传播函数 function rbm = rbmbw(rbm) rbm.reconstructed = sigmoid(rbm.hiddenState * rbm.weights' + repmat(rbm.vBias', size(rbm.hiddenState, 1), 1)); end % 实现激活函数sigmoid function output = sigmoid(input) output = 1./(1 + exp(-input)); end ``` 该源代码演示了如何使用MATLAB实现SAE。首先,载入数据集,在本例中为mnist.mat。然后,定义自编码器的层数和每层的隐藏单元数量。接下来,采用自定义函数saeetrain来创建和训练SAE,该函数内部完成每个层级的RBM训练。最后,保存训练好的模型并加载模型以进行特征提取。 请注意,这只是一个简单的示例,实际上,要实现一个高效和有效的SAE可能需要更多的代码和调整。此外,还可以根据具体的数据集和需求进行一些参数调整和改进。 ### 回答2: SAE(Stacked Autoencoder,堆叠自编码器)是一种深度学习模型,可以用于无监督学习和特征提取。在MATLAB中,可以使用深度学习工具箱来实现SAE。 下面是一个简单的SAE MATLAB实现的示例源代码: ```matlab % 导入数据集 load('dataset.mat'); % 例如,dataset.mat包含训练数据X和相应的标签Y % 设置自编码器的参数 hiddenSize = 100; % 隐藏层的大小 autoenc1 = trainAutoencoder(X, hiddenSize); % 训练第一个自编码器 % 使用第一个自编码器的编码层作为第二个自编码器的输入 features = encode(autoenc1, X); % 获得第一个自编码器的编码层特征 autoenc2 = trainAutoencoder(features, hiddenSize); % 训练第二个自编码器 % 使用第二个自编码器的编码层作为整个SAE的输入 sae = stack(autoenc1, autoenc2); % 堆叠两个自编码器形成SAE % 微调整个SAE模型 sae = train(sae, X); % 使用训练数据进行微调 ``` 上述代码首先加载训练数据集,然后定义了一个隐藏层大小为100的自编码器。通过训练第一个自编码器,可以获取到其编码层的特征。接下来,利用第一个自编码器的编码层特征,训练第二个自编码器。最后,通过堆叠两个自编码器来形成完整的SAE模型,并使用训练数据进行微调。 此外,需要注意的是,在实际应用中,可能需要根据具体问题进行参数调整和模型优化,代码示例仅作为基本参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值