42、基于神经网络的训练堆叠自编码器进行图像分类(matlab)

1、训练堆叠自编码器进行图像分类的原理及流程

基于神经网络的训练堆叠自编码器进行图像分类的原理和流程如下:

  1. 堆叠自编码器(Stacked Autoencoder)是一种无监督学习算法,由多个自编码器(Autoencoder)堆叠在一起构成。每个自编码器由一个编码器和一个解码器组成,用于学习数据的有效表示。

  2. 在图像分类任务中,首先将输入图像通过编码器部分提取特征,然后通过解码器将提取的特征重构为原始图像。通过重复此过程多次,可以逐渐提高模型对数据的表示能力。

  3. 堆叠自编码器的训练过程包括以下步骤:

    • 输入图像经过第一个编码器得到第一层的特征表示;
    • 将第一层的特征表示输入到第二个编码器中,再经过解码器重构为原始图像,得到第二层的特征表示;
    • 重复上述步骤直到所有的编码器和解码器都被训练完成。
  4. 训练堆叠自编码器的目标是最小化重构误差,即原始图像与重构图像之间的差异。通过反向传播算法来更新网络参数,使得重构误差最小化。

  5. 训练完成后,可以将堆叠自编码器的编码器部分作为特征提取器,将提取的特征输入到分类器中进行图像分类任务。

总的来说,基于神经网络的训练堆叠自编码器进行图像分类的流程是通过无监督学习训练多个自编码器,逐步从原始输入中提取特征,最终将提取的特征输入到分类器中进行图像分类任务。

2、 训练堆叠自编码器进行图像分类说明

说明1

具有多个隐含层的神经网络可用于处理复杂数据(例如图像)的分类问题。

每个层都可以学习不同抽象级别的特征。一种有效训练具有多个层的神经网络的方法是一次训练一个层。可以为每个所需的隐含层训练一种称为自编码器的特殊类型的网络。


说明2

训练具有两个隐含层的神经网络以对图像中的数字进行分类。首先,使用自编码器以无监督方式单独训练各隐含层。然后训练最终 softmax 层,并将这些层连接在一起形成堆叠网络,该网络最后以有监督方式进行训练。

3、数据集

说明

使用合成数据进行训练和测试。通过对使用不同字体创建的数字图像应用随机仿射变换来生成合成图像。
每个数字图像为 28×28 像素,共有 5000 个训练样本。可以加载训练数据,并查看其中一些图像。
图像的标签存储在一个 10×5000 矩阵中,其中每列都有一个元素为 1,指示该数字所属的类,该列中的所有其他元素为 0。请注意,如果第十个元素是 1,则数字图像是零。


1)加载训练数据到内存

代码

[xTrainImages,tTrain] = digitTrainCellArrayData;

2)展示训练图片

代码

clf
figure(1)
for i = 1:25
    subplot(5,5,i);
    imshow(xTrainImages{i});
end

试图效果

 4、训练第一个自编码器

说明

在不使用标签的情况下基于训练数据训练稀疏自编码器

自编码器是一种神经网络,该网络会尝试在其输出端复制其输入。因此,其输入的大小将与其输出的大小相同。当隐藏层中的神经元数量小于输入的大小时,自编码器将学习输入的压缩表示。神经网络在训练前具有随机初始化的权重。因此,每次训练的结果都不同。

1)显式设置随机数生成器种子

代码

rng('default')

2)设置自编码器的隐含层的大小。

说明:对于要训练的自编码器,最好使隐含层的大小小于输入大小。

代码

hiddenSize1 = 100;

 3)训练的自编码器的类型是稀疏自编码器

说明:该自编码器使用正则项来学习第一层中的稀疏表示。可以设置各种参数来控制这些正则项的影响:

L2WeightRegularization 控制 L2 正则项对网络权重(而不是偏置)的影响。这通常应该非常小。
SparsityRegularization 控制稀疏正则项的影响,该正则项会尝试对隐含层的输出的稀疏性施加约束。请注意,这与将稀疏正则项应用于权重不同。
SparsityProportion 是稀疏正则项的参数。它控制隐含层的输出的稀疏性。较SparsityProportion 值通常导致只为少数训练样本提供高输出,从而使隐藏层中的每个神经元“专门化”。例如,如果 SparsityProportion 设置为 0.1,这相当于说隐藏层中的每个神经元针对训练样本的平均输出值应该为 0.1。此值必须介于 0 和 1 之间。理想值因问题的性质而异。


现在训练自编码器,指定上述正则项的值代码

autoenc1 = trainAutoencoder(xTrainImages,hiddenSize1, ...
    'MaxEpochs',400, ...
    'L2WeightRegularization',0.004, ...
    'SparsityRegularization',4, ...
    'SparsityProportion',0.15, ...
    'ScaleData', false);
view(autoenc1)

 视图效果

说明:自编码器由一个编码器和一个解码器组成。编码器将输入映射为隐含表示,解码器则尝试进行逆映射以重新构造原始输入。


 

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

说明

自编码器的编码器部分所学习的映射可用于从数据中提取特征。编码器中的每个神经元都具有一个与之相关联的权重向量,该向量将进行相应调整以响应特定可视化特征。您可以查看这些特征的表示。
自编码器学习的特征代表了数字图像中的弯曲和笔划图案。
自编码器的隐含层的 100 维输出是输入的压缩版本,它汇总了对上面可视化的特征的响应。基于从训练数据中提取的一组向量训练下一个自编码器。首先,必须使用经过训练的自编码器中的编码器生成特征。


代码

figure(2)
plotWeights(autoenc1);
feat1 = encode(autoenc1,xTrainImages);

视图效果

 6、训练第二个自编码器

说明

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


代码

hiddenSize2 = 50;
autoenc2 = trainAutoencoder(feat1,hiddenSize2, ...
    'MaxEpochs',100, ...
    'L2WeightRegularization',0.002, ...
    'SparsityRegularization',4, ...
    'SparsityProportion',0.1, ...
    'ScaleData', false);
%使用 view 函数查看自编码器的图。
view(autoenc2)

视图效果

 将前一组特征传递给第二个自编码器中的编码器,以此提取第二组特征

说明:训练数据中的原始向量具有 784 个维度。原始数据通过第一个编码器后,维度减小到 100 维。应用第二个编码器后,维度进一步减小到 50 维。您现在可以训练最终层,以将这些 50 维向量分类为不同的数字类。

代码

feat2 = encode(autoenc2,feat1);

7、 训练最终 softmax 层

说明

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

代码

%说明:训练 softmax 层以对 50 维特征向量进行分类。与自编码器不同,您将使用训练数据的标签以有监督方式训练 softmax 层。
softnet = trainSoftmaxLayer(feat2,tTrain,'MaxEpochs',400);
%view 函数查看 softmax 层的图。
view(softnet)

视图效果


 

8、 形成堆叠神经网络

说明

已单独训练了组成堆叠神经网络的三个网络。可以查看已经过训练的三个神经网络 autoenc1、autoenc2 和 softnet。

1)形成用于分类的堆叠网络

代码

自编码器中的编码器已用于提取特征。可以将自编码器中的编码器与 softmax 层堆叠在一起,以形成用于分类的堆叠网络。
stackednet = stack(autoenc1,autoenc2,softnet);
% view 函数查看堆叠网络的图。该网络由自编码器中的编码器和 softmax 层构成。
view(stackednet)

视图效果

 2)基于测试集计算结果

说明:基于测试集计算结果。要将图像用于堆叠网络,必须将测试图像重构为矩阵。这可以通过先堆叠图像的各列以形成向量,然后根据这些向量形成矩阵来完成。


代码

% 获取图片像素
imageWidth = 28;
imageHeight = 28;
inputSize = imageWidth*imageHeight;
% 加载测试图片
[xTestImages,tTest] = digitTestCellArrayData;

% 堆叠图像的各列以形成向量,然后根据这些向量形成矩阵
xTest = zeros(inputSize,numel(xTestImages));
for i = 1:numel(xTestImages)
    xTest(:,i) = xTestImages{i}(:);
end
%使用混淆矩阵来可视化结果。矩阵右下角方块中的数字表示整体准确度。
y = stackednet(xTest);
plotconfusion(tTest,y);

视图效果

9、  微调堆叠神经网络

说明

通过对整个多层网络执行反向传播,可以改进堆叠神经网络的结果。此过程通常称为微调。通过以有监督方式基于训练数据重新训练网络来微调网络。将训练图像重构为矩阵,就像对测试图像所做的那样。


1)堆叠图像的各列以形成向量,然后根据这些向量形成矩阵

代码

xTrain = zeros(inputSize,numel(xTrainImages));
for i = 1:numel(xTrainImages)
    xTrain(:,i) = xTrainImages{i}(:);
end

2)微调执行

代码

stackednet = train(stackednet,xTrain,tTrain);

3) 使用混淆矩阵再次查看结果

代码

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

视图效果 

10、总结 

在Matlab中基于神经网络的训练堆叠自编码器进行图像分类可以按照以下步骤进行:

  1. 数据准备:准备图像数据集,并对图像进行预处理,如缩放、归一化等操作。

  2. 构建自编码器模型:使用Matlab的深度学习工具箱(Deep Learning Toolbox)构建堆叠自编码器模型。根据需要的深度,堆叠多个自编码器,每个自编码器包括编码器和解码器部分。

  3. 定义训练参数:设置训练参数,包括学习率、迭代次数、优化器等。

  4. 训练模型:使用训练数据集对堆叠自编码器模型进行训练,通过计算重构误差来更新模型参数。

  5. 特征提取:训练完成后,提取编码器部分作为特征提取器,对数据进行特征提取。

  6. 构建分类器:使用Matlab内置的分类器算法(如支持向量机、K近邻等)或者构建深度学习的分类器模型,将提取的特征输入到分类器中进行图像分类。

  7. 模型评估:使用测试数据集对训练好的模型进行评估和性能测试,评估模型的准确率、召回率等指标。

总的来说,在Matlab中进行基于神经网络的训练堆叠自编码器进行图像分类的流程包括数据准备、模型构建、训练、特征提取、分类器构建和模型评估等步骤。通过这个过程,可以实现图像分类任务并得到准确的分类结果。

11、源代码

代码

%% 训练堆叠自编码器进行图像分类
%说明:具有多个隐含层的神经网络可用于处理复杂数据(例如图像)的分类问题。每个层都可以学习不同抽象级别的特征。
%一种有效训练具有多个层的神经网络的方法是一次训练一个层。可以为每个所需的隐含层训练一种称为自编码器的特殊类型的网络。
%说明:训练具有两个隐含层的神经网络以对图像中的数字进行分类。首先,使用自编码器以无监督方式单独训练各隐含层。然后训练最终 softmax 层,
%并将这些层连接在一起形成堆叠网络,该网络最后以有监督方式进行训练。
%% 数据集
%说明:使用合成数据进行训练和测试。通过对使用不同字体创建的数字图像应用随机仿射变换来生成合成图像。
%每个数字图像为 28×28 像素,共有 5000 个训练样本。可以加载训练数据,并查看其中一些图像。
%图像的标签存储在一个 10×5000 矩阵中,其中每列都有一个元素为 1,指示该数字所属的类,该列中的所有其他元素为 0。请注意,如果第十个元素是 1,则数字图像是零。
% 加载训练数据到内存
[xTrainImages,tTrain] = digitTrainCellArrayData;
% 展示训练图片
clf
figure(1)
for i = 1:25
    subplot(5,5,i);
    imshow(xTrainImages{i});
end
%% 训练第一个自编码器
%说明:在不使用标签的情况下基于训练数据训练稀疏自编码器
%自编码器是一种神经网络,该网络会尝试在其输出端复制其输入。因此,其输入的大小将与其输出的大小相同。当隐藏层中的神经元数量小于输入的大小时,自编码器将学习输入的压缩表示。
%神经网络在训练前具有随机初始化的权重。因此,每次训练的结果都不同。
%显式设置随机数生成器种子。
rng('default')
%设置自编码器的隐含层的大小。对于要训练的自编码器,最好使隐含层的大小小于输入大小。
hiddenSize1 = 100;
%训练的自编码器的类型是稀疏自编码器。该自编码器使用正则项来学习第一层中的稀疏表示。可以设置各种参数来控制这些正则项的影响:
%L2WeightRegularization 控制 L2 正则项对网络权重(而不是偏置)的影响。这通常应该非常小。
%SparsityRegularization 控制稀疏正则项的影响,该正则项会尝试对隐含层的输出的稀疏性施加约束。请注意,这与将稀疏正则项应用于权重不同。
%SparsityProportion 是稀疏正则项的参数。它控制隐含层的输出的稀疏性。较低的 SparsityProportion 值通常导致只为少数训练样本提供高输出,从而使隐藏层中的每个神经元“专门化”。例如,如果 SparsityProportion 设置为 0.1,这相当于说隐藏层中的每个神经元针对训练样本的平均输出值应该为 0.1。此值必须介于 0 和 1 之间。理想值因问题的性质而异。
%现在训练自编码器,指定上述正则项的值。
autoenc1 = trainAutoencoder(xTrainImages,hiddenSize1, ...
    'MaxEpochs',400, ...
    'L2WeightRegularization',0.004, ...
    'SparsityRegularization',4, ...
    'SparsityProportion',0.15, ...
    'ScaleData', false);
%自编码器由一个编码器和一个解码器组成。编码器将输入映射为隐含表示,解码器则尝试进行逆映射以重新构造原始输入。
view(autoenc1)
%% 可视化第一个自编码器的权重
%自编码器的编码器部分所学习的映射可用于从数据中提取特征。编码器中的每个神经元都具有一个与之相关联的权重向量,该向量将进行相应调整以响应特定可视化特征。您可以查看这些特征的表示。
%自编码器学习的特征代表了数字图像中的弯曲和笔划图案。
%自编码器的隐含层的 100 维输出是输入的压缩版本,它汇总了对上面可视化的特征的响应。基于从训练数据中提取的一组向量训练下一个自编码器。首先,必须使用经过训练的自编码器中的编码器生成特征。
figure(2)
plotWeights(autoenc1);
feat1 = encode(autoenc1,xTrainImages);
%% 训练第二个自编码器
%说明:以相似的方式训练第二个自编码器。主要区别在于使用从第一个自编码器生成的特征作为第二个自编码器中的训练数据。此外,您还需要将隐含表示的大小减小到 50,以便第二个自编码器中的编码器学习输入数据的更小表示。
hiddenSize2 = 50;
autoenc2 = trainAutoencoder(feat1,hiddenSize2, ...
    'MaxEpochs',100, ...
    'L2WeightRegularization',0.002, ...
    'SparsityRegularization',4, ...
    'SparsityProportion',0.1, ...
    'ScaleData', false);
%使用 view 函数查看自编码器的图。
view(autoenc2)
%将前一组特征传递给第二个自编码器中的编码器,以此提取第二组特征。
feat2 = encode(autoenc2,feat1);
%训练数据中的原始向量具有 784 个维度。原始数据通过第一个编码器后,维度减小到 100 维。应用第二个编码器后,维度进一步减小到 50 维。您现在可以训练最终层,以将这些 50 维向量分类为不同的数字类。
%% 训练最终 softmax 层
%说明:训练 softmax 层以对 50 维特征向量进行分类。与自编码器不同,您将使用训练数据的标签以有监督方式训练 softmax 层。
softnet = trainSoftmaxLayer(feat2,tTrain,'MaxEpochs',400);
%view 函数查看 softmax 层的图。
view(softnet)
%% 形成堆叠神经网络
%已单独训练了组成堆叠神经网络的三个网络。可以查看已经过训练的三个神经网络 autoenc1、autoenc2 和 softnet。
view(autoenc1)
view(autoenc2)
view(softnet)
%自编码器中的编码器已用于提取特征。可以将自编码器中的编码器与 softmax 层堆叠在一起,以形成用于分类的堆叠网络。
stackednet = stack(autoenc1,autoenc2,softnet);
% view 函数查看堆叠网络的图。该网络由自编码器中的编码器和 softmax 层构成。
view(stackednet)
%基于测试集计算结果。要将图像用于堆叠网络,必须将测试图像重构为矩阵。这可以通过先堆叠图像的各列以形成向量,然后根据这些向量形成矩阵来完成。
% 获取图片像素
imageWidth = 28;
imageHeight = 28;
inputSize = imageWidth*imageHeight;
% 加载测试图片
[xTestImages,tTest] = digitTestCellArrayData;

% 堆叠图像的各列以形成向量,然后根据这些向量形成矩阵
xTest = zeros(inputSize,numel(xTestImages));
for i = 1:numel(xTestImages)
    xTest(:,i) = xTestImages{i}(:);
end
%使用混淆矩阵来可视化结果。矩阵右下角方块中的数字表示整体准确度。
y = stackednet(xTest);
plotconfusion(tTest,y);
%% 微调堆叠神经网络
%说明:通过对整个多层网络执行反向传播,可以改进堆叠神经网络的结果。此过程通常称为微调。
%通过以有监督方式基于训练数据重新训练网络来微调网络。将训练图像重构为矩阵,就像对测试图像所做的那样。
% 堆叠图像的各列以形成向量,然后根据这些向量形成矩阵
xTrain = zeros(inputSize,numel(xTrainImages));
for i = 1:numel(xTrainImages)
    xTrain(:,i) = xTrainImages{i}(:);
end
% 微调执行
stackednet = train(stackednet,xTrain,tTrain);
% 使用混淆矩阵再次查看结果。
y = stackednet(xTest);
plotconfusion(tTest,y);





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/722200.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Windows】配置Flutter开发环境

一、下载 flutter sdk 点此跳至下载官网 下载好flutter sdk,并解压到自定义的位置。 二、配置环境变量 此电脑 --> 右键 选择 属性 --> 点击 高级系统设置 --> 会弹出系统属性的窗口,点击 环境变量 按钮 1.配置加速镜像地址 PUB_HOSTED_…

IP协议的相关特性

IP协议的报文结构 如图: 上述的IP协议是ipv4的版本,如上述图中的4位版本号。 现当今的世界仅有两个版本分为ipv4和ipv6。 在这里我以ipv4来介绍IP协议。 IP协议的报头最长为60个字节,最短为20个字节。 如图8个服务类型: 这里不…

python5 正则表达式

Python中的正则表达式是一种强大的工具,用于在文本中搜索、匹配和处理特定模式的字符串。它们通过定义一种模式,使得可以轻松地搜索、替换、提取和验证文本数据,在Python中的正则表达式由re模块提供支持的。 正则表达式通常用于以下任务&…

【HTML01】HTML基础-基本元素-附带案例-作业

文章目录 HTML 概述学HTML到底学什么HTML的基本结构HTML的注释的作用html的语法HTML的常用标签:相关单词参考资料 HTML 概述 英文全称:Hyper Text Markup Language 中文:超文本标记语言,就将常用的50多个标记嵌入在纯文本中&…

AI办公自动化:用通义千问批量翻译长篇英语TXT文档

在deepseek中输入提示词: 你是一个Python编程专家,现在要完成一个编写基于qwen-turbo模型API和dashscope库的程序脚本,具体步骤如下: 打开文件夹:F:\AI自媒体内容\待翻译; 获取里面所有TXT文档&#xff…

【博弈】843. 猜猜这个单词

本题涉及知识点 博弈 LeetCode843. 猜猜这个单词 给你一个由 不同 字符串组成的单词列表 words ,其中 words[i] 长度均为 6 。words 中的一个单词将被选作秘密单词 secret 。 另给你一个辅助对象 Master ,你可以调用 Master.guess(word) 来猜单词&…

APS-SCM联动:开创生产调度与供应链管理新篇章

在当今激烈的市场产品竞争环境下,企业不仅需要灵活高效的内部生产流程,更需具备对外部环境快速响应的能力,从而保证产品保质保量的生产完成,快速占据更多的市场份额。正是在这样的背景下,APS(Advanced Plan…

从社交网络到元宇宙:Facebook的战略转型

随着科技的迅猛发展和数字化时代的深入,社交网络已不再局限于简单的信息交流和社交互动,而是逐步向更广阔、更深远的虚拟现实空间——元宇宙(Metaverse)转变。作为全球最大的社交网络平台之一,Facebook正在积极推动这一…

JS安全应用

JS应用 常见分析调试: -代码全局搜索 案例 登录框,可以看到发送用户名密码被JS加密 搜索Username,找到加密地方 logindata.UserName encodeURI(encrypt.encrypt(numMobile));logindata.Mobile encodeURI(encrypt.encrypt(numMobile));…

Python将Markdown格式转为HTML:轻松实现博客文章的自动化处理

哈喽,大家好,我是木头左! 引言 编写一篇高质量的博客文章并非易事,尤其是在排版和格式方面。Markdown作为一种轻量级的标记语言,为博主们提供了一种简洁、高效的写作方式。而Python作为一门强大的编程语言&#xff0c…

SpringBoot的入门案例

1、创建一个Maven工程 2、点击设置自动导入jar包 3、导入spring boot需要的依赖 打开sping boot的文档 导入依赖的pom.xml配置内容 4、创建一个spring boot的执行入口程序 5、写controller,service,dao的页面逻辑代码 6、测试,运行工程&#…

Repetition Improves Language Model Embeddings论文阅读笔记

文章提出了一种提高decoder-only LLM的embedding能力的方法,叫echo embeddingslast-token pooling(即直接选最后一个token作为句子的embedding)和直接mean pooling都不如文章提出的echo embedding,做法是把句子重复两次&#xff0…

Ardupilot开源代码之ExpressLRS性能实测方法

Ardupilot开源代码之ExpressLRS性能实测方法 1. 源由2. 测试效果3. 测试配置4. 总结5. 参考资料6. 补充 1. 源由 之前一直在讨论ExpressLRS性能的问题,有理论、模拟、实测。 始终缺乏完整的同一次测试的测试数据集,本章节将介绍如何在Ardupilot上进行获…

【Redis】内存回收和内存淘汰机制

1 概念 Redis 所有的数据都是存储在内存中的, 如果不进行任何的内存回收, 那么很容易出现内存爆满的情况。因此,在某些情况下需要对占用的内存空间进行释放。 Redis 中内存的释放主要分为两类 Redis 中内存的释放主要分为两类: 内存回收: 将过期的 key 清除&#…

算法训练与程序竞赛题目集合(L1)

目录 L1-001 Hello World! 输入格式: 输出格式: L1-002 打印沙漏 输入格式: 输出格式: 输入样例: 输出样例: L1-003 个位数统计 输入格式: 输出格式: 输入样例: 输出样例: L1-004 计算摄氏温度 输入格式: 输出格式…

[保姆级教程]uniapp实现页面路由配置

文章目录 新建目录新建页面配置页面路由修改tabBar地址其他:在package.json中的pages配置详细 新建目录 先点击src–》新建–》目录 输入名称,并以此类推完成所有新建目录 新建页面 右击目录,点击新建–》vue文件 弹出弹框,…

【HTTPS】Wireshark导入密钥文件后仍无法解密https报文

个人搭建了一个HTTPS网站后,想通过Wireshark抓包https报文并解密。在本站查询了大量文章后,发现介绍的方法基本就分两步: 1、在本地Windows系统上新增系统环境变量"SSLKEYLOGFILE",保存Chrome浏览器访问网站时使用的密…

SpringMVC系列五: SpringMVC映射请求数据

SpringMVC映射请求数据 💞获取参数值说明应用实例 💞获取http请求消息头💞获取JavaBean对象使用场景说明应用实例注意事项和细节 💞获取servlet api说明应用实例注意事项和细节 上一讲, 我们学习的是SpringMVC系列四: Rest-优雅的…

Intelij IDEA中Mapper.xml无法构建到资源目录的问题

问题场景: 在尝试把原本在eclipse上的Java Web项目转移至Intelij idea上时,在配置文件均与eclipse一致的情况下出现了如下报错: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.umbrella.crm_core.…