在前面两篇博客的基础上,可以实现单层自编码器网络(一个解码器+一个解码器)。对于多层自编码器的实现,MATLAB给出了堆栈自编码器用于图像分类的网页Train Stacked Autoencoders for Image Classification
,本文对其进行翻译和学习。

堆栈自编码器Stacked Autoencoders

具有多个隐藏层的神经网络可用于解决图像等复杂数据的分类问题。每个层都可以在不同的抽象级别学习特性。然而,训练具有多个隐藏层的神经网络在实践中可能是困难的。一种有效训练多层神经网络的方法是一次训练一层。可以通过为每个隐藏层训练一种称为自编码器的特殊网络来实现这一点。

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

代码实现

代码较长,因此注释也比较多,但是其基本思想并不复杂,实现的过程也容易理解。

%% Train Stacked Autoencoders for Image Classification训练用于图像分类的堆栈自编码器
%% 导入训练集
% 此示例始终使用合成数据进行训练和测试。已通过对使用不同字体创建的数字图像应用随机仿射变换来生成合成图像
% 每个数字图像为 28×28 像素,共有 5000 个训练样本。您可以加载训练数据,并查看其中一些图像
% Load the training data into memory 加载自带的手写数字数据集
clear;
clc;
[xTrainImages,tTrain] = digitTrainCellArrayData;
% 展示图像
clf
for i = 1:20subplot(4,5,i);imshow(xTrainImages{i});
end
%% Training the first autoencoder 训练第一个自编码器
% 首先在不使用标签的情况下基于训练数据训练稀疏自编码器。
% 自编码器是一种神经网络,该网络会尝试在其输出端复制其输入。因此,其输入的大小将与其输出的大小相同。
% 当隐含层中的神经元数量小于输入的大小时,自编码器将学习输入的压缩表示。
% 神经网络在训练前具有随机初始化的权重。因此,每次训练的结果都不同。为避免此行为,请显式设置随机数生成器种子。
rng('default')%确保随机数
hiddenSize1 = 100;%设置自编码器的隐含层的大小。对于要训练的自编码器,最好使隐含层的大小小于输入大小。
% 训练设置
autoenc1 = trainAutoencoder(xTrainImages,hiddenSize1, ... 'MaxEpochs',400, ...    % 最大训练轮次400个'L2WeightRegularization',0.004, ...   % L2正则项对网络权重的影响,通常非常小'SparsityRegularization',4, ...       % 稀疏正则项的系数'SparsityProportion',0.15, ...        % 稀疏比例'ScaleData', false);     %输入数据不进行缩放
% 查看第一个自编码器的结构
view(autoenc1)
% 可视化第一个自编码器的权重
% 自编码器的编码器部分所学习的映射可用于从数据中提取特征。
% 编码器中的每个神经元都具有一个与之相关联的权重向量,该向量将进行相应调整以响应特定可视化特征。您可以查看这些特征的表示。
figure()
plotWeights(autoenc1);
% 可以看到,自编码器学习的特征代表了数字图像中的弯曲和笔划图案。
% 自编码器的隐含层的 100 维输出是输入的压缩版本,它汇总了对上面可视化特征的响应。
% 基于从训练数据中提取的一组向量训练下一个自编码器。首先,必须使用经过训练的自编码器中的编码器生成特征。
feat1 = encode(autoenc1,xTrainImages); % 自编码器1的输出
%% Training the second autoencoder  训练第二个自编码器
% 以相似的方式训练第二个自编码器,主要区别在于使用第一个自编码器的输出作为第二个自编码器的输入。
% 还需要将隐含表示的大小减小到 50,以便第二个自编码器中的编码器学习输入数据的更小表示。
hiddenSize2 = 50;
autoenc2 = trainAutoencoder(feat1,hiddenSize2, ...'MaxEpochs',100, ...'L2WeightRegularization',0.002, ...'SparsityRegularization',4, ...'SparsityProportion',0.1, ...'ScaleData', false);
% 查看第二个自编码器的结构
view(autoenc2)
% 自编码器2的输出
feat2 = encode(autoenc2,feat1);
%% Training the final softmax layer 训练最后的分类层softmax
% 训练数据中的原始向量具有 784 个维度。原始数据通过第一个编码器后,维度减小到 100 维。
% 应用第二个编码器后,维度进一步减小到 50 维。
% 训练最后一层softmax层以对 50 维特征向量进行分类。
% 与自编码器不同,这里使用训练数据的标签以有监督方式训练 softmax 层。
softnet = trainSoftmaxLayer(feat2,tTrain,'MaxEpochs',400);%trainSoftmaxLayer(输入特征,输出标签,参数(循环次数),参数值)
% 显示softmax网络
view(softnet)
% 将自编码器中的编码器与 softmax 层堆叠在一起,以形成用于分类的堆叠网络
deepnet = stack(autoenc1,autoenc2,softnet);%网络合成
view(deepnet) % 深度网络的显示
%% 构建测试集并进行测试
% 在搭建了完整网络之后,可以基于测试集计算结果。要将图像用于堆叠网络,必须将测试图像重构为矩阵。
% 这可以通过先堆叠图像的各列以形成向量,然后根据这些向量形成矩阵来完成。
% 获取每个图像中的像素数
imageWidth = 28;
imageHeight = 28;
inputSize = imageWidth*imageHeight; % 输入矩阵的大小
% 载入测试图像
[xTestImages,tTest] = digitTestCellArrayData;
% 图像转换为向量并放在矩阵中
xTest = zeros(inputSize,numel(xTestImages)); %生成一个0矩阵,numel计算图像中的元素个数
for i = 1:numel(xTestImages)xTest(:,i) = xTestImages{i}(:);
end
% 网络测试
y = deepnet(xTest); %测试结果输出
plotconfusion(tTest,y); % 测试结果对比,使用混淆矩阵来可视化结果
%% Fine tuning the deep neural network 微调深度神经网络
% 通过对整个多层网络执行反向传播,可以改进堆叠神经网络的结果,此过程通常称为微调。
% 通过以有监督方式基于训练数据重新训练网络来进行微调。在执行此操作之前,必须将训练图像重构为矩阵,就像对测试图像所做的那样。
xTrain = zeros(inputSize,numel(xTrainImages));
for i = 1:numel(xTrainImages)xTrain(:,i) = xTrainImages{i}(:);
end
% 进行微调
deepnet = train(deepnet,xTrain,tTrain);
%再次显示结果并对比
y = deepnet(xTest);
plotconfusion(tTest,y); 

MATLAB实现自编码器(三)——堆栈自编码器Stacked Autoencoders实现手写数字分类相关推荐

  1. MATLAB可视化实战系列(四十)-基于MATLAB 自带手写数字集的CNN(LeNet5)手写数字识别-图像处理(附源代码)

    一.前言 利用MATLAB实践MNIST手写数字识别,下载手写数据集的准备工作有些麻烦. 以下是我为大家准备的几个精品专栏,喜欢的小伙伴可自行订阅,你的支持就是我不断更新的动力哟! MATLAB-30 ...

  2. BP神经网络识别手写数字项目解析及matlab实现

    BP神经网络指传统的人工神经网络,相比于卷积神经网络(CNN)来说要简单些. 人工神经网络具有复杂模式和进行联想.推理记忆的功能, 它是解决某些传统方法所无法解决的问题的有力工具.目前, 它日益受到重 ...

  3. MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试

    文章目录 MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试 一.题目要求 二.完整的目录结构说明 三.Mnist数据集及数据格式转换 四.BP神经网络相关知识 4.1 ...

  4. 基于matlab BP神经网络的手写数字识别

    摘要 本文实现了基于MATLAB关于神经网络的手写数字识别算法的设计过程,采用神经网络中反向传播神经网络(即BP神经网络)对手写数字的识别,由MATLAB对图片进行读入.灰度化以及二值化等处理,通过神 ...

  5. 基于支持向量机的手写数字识别详解(MATLAB GUI代码,提供手写板)

    摘要:本文详细介绍如何利用MATLAB实现手写数字的识别,其中特征提取过程采用方向梯度直方图(HOG)特征,分类过程采用性能优异的支持向量机(SVM)算法,训练测试数据集为学术及工程上常用的MNIST ...

  6. 【手写数字识别】基于matlab GUI BP神经网络单个或连续手写数字识别系统【含Matlab源码 2296期】

    ⛄一.手写数字识别技术简介 1 案例背景 手写体数字识别是图像识别学科下的一个分支,是图像处理和模式识别研究领域的重要应用之一,并且具有很强的通用性.由于手写体数字的随意性很大,如笔画粗细.字体大小. ...

  7. 基于神经网络实现手写数字识别(matlab)

    实验目的 在matlab平台上,采用神经网络实现手写数字识别.在实验过程中: 1.初步探讨数据集预处理的作用. 2.增加对神经网络的理解,探讨隐含层层数,节点数和训练步长对识别成功率的影响,找到较佳的 ...

  8. 深蓝学院第三章:基于卷积神经网络(CNN)的手写数字识别实践

    参看之前篇章的用全连接神经网络去做手写识别:https://blog.csdn.net/m0_37957160/article/details/114105389?spm=1001.2014.3001 ...

  9. MATLAB实现数字识别系统,基于人工神经网络的MATLAB手写数字识别系统

    <基于人工神经网络的MATLAB手写数字识别系统>由会员分享,可在线阅读,更多相关<基于人工神经网络的MATLAB手写数字识别系统(8页珍藏版)>请在人人文库网上搜索. 1.基 ...

最新文章

  1. Paddle下的Tensor运算以及简单回归问题
  2. VS2008 + Silverlight初步学习
  3. python学习笔记(05)
  4. java annotation list_Java 注解 (Annotation)你可以这样学
  5. 暗物质组成原理当然是不存在计算机,暗物质能组成生命吗?小部分暗物质可能会相互作用...
  6. Codeforces Round #620 (Div. 2) F2. Animal Observation (hard version) dp + 线段树
  7. 阿里《Java手册》做一个有技术情怀的人
  8. 深度学习《EBGAN》
  9. Expression Blend中文教程 - 开篇
  10. Git学习(二)远程仓库建立与克隆
  11. Jsoup解析网页html
  12. 02函数极限存在条件
  13. mysql查询excel表_使用SQL语句实现对Excel工作表数据进行查询的方法
  14. 实战大数据平台开发架构讲解,免费大数据教学视频等你来拿
  15. 将心比心,我要有点骨气
  16. 常用单片机模块(四)
  17. 12面魔方公式图解法_高手指教一下十二面魔方怎么拼?
  18. 分布式事务—Lec12课前资料
  19. 软件架构非功能需求——可靠性
  20. 网页设计与制作常考概念以及问答题

热门文章

  1. JavaScript百炼成仙 1.18 函数七重关之一 (函数定义)
  2. 拼搏别样的未来,中国社科院与美国杜兰大学金融管理硕士项目助力你的人生旅程
  3. ICC2: secondary pg pin的作用与连接
  4. 抖音xg8404 X-Gorgon算法 IOS苹果协议算法
  5. 模仿人类逻辑,首个BERT模型AI通过初二科学考试!研究人员:完成了老板遗愿...
  6. 相机内存卡格式化了怎么恢复
  7. 小学教师听课体会 计算机,小学教师观有效课堂听课心得体会
  8. 计算机模拟图像和数字,模拟与数字的区别
  9. java 动态密码错误_什么是OTP:Java一次动态密码、付款码原理
  10. 如何盘活新零售5大线上线下交互模式?拥抱用户与收益增长