63、基于深度学习网络的数字分类(matlab)

news2024/11/16 4:32:58

1、基于深度学习网络的数字分类的原理及流程

基于深度学习网络的数字分类是一种常见的机器学习任务,通常使用的是卷积神经网络(CNN)来实现。下面是其原理及流程的简要说明:

  1. 数据收集:首先,需要收集包含数字图像和对应标签的数据集,用于训练模型。

  2. 数据预处理:对数据集进行预处理,包括图像的缩放、灰度处理、归一化等,以便输入模型进行训练。

  3. 构建深度学习网络:使用卷积神经网络(CNN)来构建模型。CNN包含卷积层、池化层、全连接层等,用于学习特征并进行分类。

  4. 模型训练:将预处理后的数据输入到CNN模型中进行训练,通过反向传播算法优化模型参数,使模型能够准确地分类数字。

  5. 模型评估:使用测试集对训练好的模型进行评估,计算模型的准确率、精确率、召回率等指标,评估模型的性能。

  6. 模型应用:将训练好的模型用于数字图像分类任务,输入待分类的数字图像,模型输出对应的分类结果。

  7. 模型优化:根据评估结果对模型进行优化,如调整网络结构、调整超参数等,提高模型的分类性能。

总的来说,基于深度学习网络的数字分类主要包括数据收集、数据预处理、网络构建、模型训练、模型评估、模型应用和模型优化等步骤,通过不断学习和调优,使模型能够准确地分类数字图像。

2、基于深度学习网络的数字分类说明

1)程序流程

1创建和训练简单的卷积神经网络来进行深度学习分类

2加载和浏览图像数据。

3定义神经网络架构。

4指定训练选项。

5训练神经网络。

6预测新数据的标签并计算分类准确度。

3、加载和浏览图像数据

1)加载数据

说明

使用 imageDatastore 函数将位数数据加载为图像数据存储,并指定包含图像数据的文件夹。通过图像数据存储可以存储大图像数据,包括无法放入内存的数据,并在卷积神经网络的训练过程中高效分批读取图像。

代码

dataFolder = "DigitsData";
imds = imageDatastore(dataFolder, ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

2) 显示数据存储中的部分图像

代码

figure(1)
tiledlayout("flow");
perm = randperm(10000,20);
for i = 1:20
    nexttile
    imshow(imds.Files{perm(i)});
end

视图效果

f8c8ad2ea3a041b5b79db79659c290cb.png

3) 计算每个类别中的图像数量

说明

数据存储包含数字 0-9 的总共 10000 个图像,每个数字对应 1000 个图像。您可以在神经网络的最后一个全连接层中指定类数作为 OutputSize 参量。

代码

classNames = categories(imds.Labels);
labelCount = countEachLabel(imds)
labelCount =

  10×2 table

    Label    Count
    _____    _____

      0      1000 
      1      1000 
      2      1000 
      3      1000 
      4      1000 
      5      1000 
      6      1000 
      7      1000 
      8      1000 
      9      1000 

4)检查 digitData 中第一个图像的大小

说明

每个图像的大小均为 28×28×1 像素

代码 

img = readimage(imds,1);
size(img)
ans =

    28    28

4、指定训练集和验证集

1)说明

将数据划分为训练数据集和验证数据集,以使训练集中的每个类别包含 750 个图像,并且验证集包含对应每个标签的其余图像。

splitEachLabel 将数据存储 imds 拆分为两个新的数据存储 imdsTrain 和 imdsValidation。

2)代码

numTrainFiles = 750;
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,"randomize");

5、定义神经网络架构

1)说明

1 图像输入层 imageInputLayer 用于指定图像大小

在本例中为 28×28×1。这些数字对应于高度、宽度和通道大小。数字数据由灰度图像组成,因此通道大小(颜色通道)为 1。对于彩色图像,通道大小为 3,对应于 RGB 值。您不需要打乱数据,因为 trainnet 默认会在训练开始时打乱数据。trainnet 还可以在训练过程中的每轮训练开始时自动打乱数据。

2 卷积层在卷积层中,第一个参量是 filterSize,它是训练函数在沿图像扫描时使用的滤波器的高度和宽度。

第一个参量是 filterSize,它是训练函数在沿图像扫描时使用的滤波器的高度和宽度。在此示例中,数字 3 表示滤波器大小为 3×3。您可以为滤波器的高度和宽度指定不同大小。第二个参量是滤波器数量 numFilters,它是连接到同一输入区域的神经元数量。此参数决定了特征图的数量。使用 Padding 名称-值参量输入特征图进行填充。对于默认步幅为 1 的卷积层,"same" 填充可确保空间输出大小与输入大小相同。您也可以使用 convolution2dLayer 的名称-值参量定义该层的步幅和学习率。

3 批量归一化层批量归一化层对神经网络中的激活值和梯度传播进行归一化,使神经网络训练成为更简单的优化问题。

在卷积层和非线性部分(例如 ReLU 层)之间使用批量归一化层,来加速神经网络训练并降低对神经网络初始化的敏感度。使用 batchNormalizationLayer 创建批量归一化层。

4 ReLU 层批量归一化层后接一个非线性激活函数。

最常见的激活函数是修正线性单元 (ReLU)。使用 reluLayer 创建 ReLU 层。

5 最大池化层卷积层(带激活函数)有时会后跟下采样操作,以减小特征图的空间大小并删除冗余空间信息。

通过下采样可以增加更深卷积层中的滤波器数量,而不会增加每层所需的计算量。下采样的一种方法是使用最大池化,可使用 maxPooling2dLayer 创建。最大池化层返回由第一个参量 poolSize 指定的矩形输入区域的最大值。在此示例中,该矩形区域的大小是 [2,2]。Stride 名称-值参量指定训练函数在沿输入扫描时所采用的步长。

6 全连接层卷积层和下采样层后跟一个或多个全连接层。

该层将先前层在图像中学习的所有特征组合在一起,以识别较大的模式。最后一个全连接层将特征组合在一起来对图像进行分类。因此,最后一个全连接层中的 OutputSize 参数等于目标数据中的类数。在此示例中,输出大小为 10,对应于 10 个类。使用 fullyConnectedLayer 创建全连接层。

7 softmax 层 softmax 激活函数对全连接层的输出进行归一化。

softmax 层的输出由总和为 1 的多个正数组成,这些数字随后可被分类层用作分类概率。使用 softmaxLayer 函数在最后一个全连接层后创建一个 softmax 层。

2)代码实现

layers = [
    imageInputLayer([28 28 1])
    
    convolution2dLayer(3,8,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,Stride=2)
    
    convolution2dLayer(3,16,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,Stride=2)
    
    convolution2dLayer(3,32,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    fullyConnectedLayer(10)
    softmaxLayer];

6、指定训练选项

1)说明

使用具有动量的随机梯度下降 (SGDM) 训练神经网络,初始学习率为 0.01。

将最大训练轮数设置为 4。一轮训练是对整个训练数据集的一个完整训练周期。

每轮训练都会打乱数据。

通过指定验证数据和验证频率,监控训练过程中的神经网络准确度。软件基于训练数据训练神经网络,并在训练过程中按固定时间间隔计算基于验证数据的准确度。验证数据不用于更新神经网络权重。

在图中显示训练进度并监控准确度

2)代码实现

options = trainingOptions("sgdm", ...
    InitialLearnRate=0.01, ...
    MaxEpochs=4, ...
    Shuffle="every-epoch", ...
    ValidationData=imdsValidation, ...
    ValidationFrequency=30, ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=false);

7、使用训练数据训练神经网络

1)说明

使用 layers 定义的架构、训练数据和训练选项训练神经网络。

默认情况下,trainnet 使用 GPU(如果有),否则使用 CPU。

在 GPU 上训练需要 Parallel Computing Toolbox™ 和支持的 GPU 设备

训练进度图显示了小批量损失和准确度以及验证损失和准确度。损失是交叉熵损失。准确度是神经网络分类正确的图像的百分比。

2)代码实现

net = trainnet(imdsTrain,layers,"crossentropy",options);

3)视图效果 

75e02c7438634393a37b1c61e5a8d0c6.png

8、对验证图像进行分类并计算准确度

1)对测试图像进行分类

使用 minibatchpredict 函数对多个观测值进行预测

使用 scores2label 函数将预测分数转换为标签

minibatchpredict 函数自动使用 GPU(如果有)。否则,该函数使用 CPU。

2)代码实现

scores = minibatchpredict(net,imdsValidation);
YValidation = scores2label(scores,classNames);

 3)计算分类准确度

准确度是正确预测的标签的百分比

4)代码实现

TValidation = imdsValidation.Labels;
accuracy = mean(YValidation == TValidation)

9、总结

在Matlab中实现基于深度学习网络的数字分类通常涉及以下步骤:

  1. 数据准备:首先,你需要准备包含数字图像和对应标签的数据集。Matlab提供了数据存储和处理的功能,可以方便地加载和处理数据。

  2. 搭建深度学习网络:Matlab提供了深度学习工具箱(Deep Learning Toolbox),可以使用内置的函数和网络结构创建卷积神经网络(CNN)模型。你可以选择不同的网络结构,根据需要进行修改和调整。

  3. 数据预处理:在训练之前,需要对数据进行预处理,例如缩放、归一化、图像增强等。Matlab提供了丰富的图像处理函数和工具,可以帮助你进行数据预处理。

  4. 模型训练:使用准备好的数据集和搭建好的深度学习网络进行模型训练。你可以使用Matlab提供的训练函数,如trainNetwork,来进行模型训练,并监控训练进度和性能。

  5. 模型评估:在训练完成后,使用测试集对训练好的模型进行评估,计算模型的准确率、精确率、召回率等指标,评估模型的性能。

  6. 模型应用:将训练好的模型用于数字图像分类任务,输入待分类的数字图像,模型输出对应的分类结果。Matlab提供了方便的函数,可以用于模型的推理和预测。

  7. 模型优化:根据评估结果对模型进行优化,如调整网络结构、调整超参数等,提高模型的分类性能。

综上所述,利用Matlab实现基于深度学习网络的数字分类可以借助其强大的深度学习工具箱和图像处理功能,帮助用户快速搭建、训练和评估数字分类模型。

10、源代码

代码

%% 基于深度学习网络的数字分类
%创建和训练简单的卷积神经网络来进行深度学习分类
%加载和浏览图像数据。
%定义神经网络架构。
%指定训练选项。
%训练神经网络。
%预测新数据的标签并计算分类准确度。

%% 加载和浏览图像数据
%使用 imageDatastore 函数将位数数据加载为图像数据存储,并指定包含图像数据的文件夹。通过图像数据存储可以存储大图像数据,包括无法放入内存的数据,并在卷积神经网络的训练过程中高效分批读取图像。
dataFolder = "DigitsData";
imds = imageDatastore(dataFolder, ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

%显示数据存储中的部分图像。
figure(1)
tiledlayout("flow");
perm = randperm(10000,20);
for i = 1:20
    nexttile
    imshow(imds.Files{perm(i)});
end
%计算每个类别中的图像数量。
%数据存储包含数字 0-9 的总共 10000 个图像,每个数字对应 1000 个图像。您可以在神经网络的最后一个全连接层中指定类数作为 OutputSize 参量。
classNames = categories(imds.Labels);
labelCount = countEachLabel(imds)

%检查 digitData 中第一个图像的大小
%每个图像的大小均为 28×28×1 像素。
img = readimage(imds,1);
size(img)

%% 指定训练集和验证集
%将数据划分为训练数据集和验证数据集,以使训练集中的每个类别包含 750 个图像,并且验证集包含对应每个标签的其余图像。
%splitEachLabel 将数据存储 imds 拆分为两个新的数据存储 imdsTrain 和 imdsValidation。
numTrainFiles = 750;
[imdsTrain,imdsValidation] = splitEachLabel(imds,numTrainFiles,"randomize");

%% 定义神经网络架构
%图像输入层 imageInputLayer 用于指定图像大小
%卷积层在卷积层中,第一个参量是 filterSize,它是训练函数在沿图像扫描时使用的滤波器的高度和宽度。
%批量归一化层批量归一化层对神经网络中的激活值和梯度传播进行归一化,使神经网络训练成为更简单的优化问题。
%ReLU 层批量归一化层后接一个非线性激活函数。
%最大池化层卷积层(带激活函数)有时会后跟下采样操作,以减小特征图的空间大小并删除冗余空间信息。
%全连接层卷积层和下采样层后跟一个或多个全连接层。
%softmax 层 softmax 激活函数对全连接层的输出进行归一化。
layers = [
    imageInputLayer([28 28 1])
    
    convolution2dLayer(3,8,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,Stride=2)
    
    convolution2dLayer(3,16,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    maxPooling2dLayer(2,Stride=2)
    
    convolution2dLayer(3,32,Padding="same")
    batchNormalizationLayer
    reluLayer
    
    fullyConnectedLayer(10)
    softmaxLayer];
%% 指定训练选项
%使用具有动量的随机梯度下降 (SGDM) 训练神经网络,初始学习率为 0.01。
%将最大训练轮数设置为 4。一轮训练是对整个训练数据集的一个完整训练周期。
%每轮训练都会打乱数据。
%通过指定验证数据和验证频率,监控训练过程中的神经网络准确度。软件基于训练数据训练神经网络,并在训练过程中按固定时间间隔计算基于验证数据的准确度。验证数据不用于更新神经网络权重。
%在图中显示训练进度并监控准确度
options = trainingOptions("sgdm", ...
    InitialLearnRate=0.01, ...
    MaxEpochs=4, ...
    Shuffle="every-epoch", ...
    ValidationData=imdsValidation, ...
    ValidationFrequency=30, ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=false);
%% 使用训练数据训练神经网络
%使用 layers 定义的架构、训练数据和训练选项训练神经网络。
%默认情况下,trainnet 使用 GPU(如果有),否则使用 CPU。
%在 GPU 上训练需要 Parallel Computing Toolbox™ 和支持的 GPU 设备
%训练进度图显示了小批量损失和准确度以及验证损失和准确度。损失是交叉熵损失。准确度是神经网络分类正确的图像的百分比。
net = trainnet(imdsTrain,layers,"crossentropy",options);
%% 对验证图像进行分类并计算准确度
%对测试图像进行分类。
%使用 minibatchpredict 函数对多个观测值进行预测
%使用 scores2label 函数将预测分数转换为标签
%minibatchpredict 函数自动使用 GPU(如果有)。否则,该函数使用 CPU。
scores = minibatchpredict(net,imdsValidation);
YValidation = scores2label(scores,classNames);
%计算分类准确度
%准确度是正确预测的标签的百分比
TValidation = imdsValidation.Labels;
accuracy = mean(YValidation == TValidation)

工程文件

https://download.csdn.net/download/XU157303764/89496283

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mybatis一级缓存

缓存 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。MyBatis 3 中的缓存实现的很多改进都已经实现了,使得它更加强大而且易于配置。 Mybatis和Hibernate一样,也有一级和二级缓存,同样默认开启的只有一级缓存,二级缓…

【笔记】解决 CSS:backface-visibility:hidden; 容器翻转 引起的容器内 input不可用

起因 今天,做了一个卡片翻转的案例。原本参考的案例是一个非常简单的两个div翻面效果,使用的 backface-visibility:hidden; 实现两个容器互为背面。基础div就是纯色,什么都没有,很容易就实现了翻转。 出现问题 我要做的案例&am…

【Python机器学习】算法链与管道——在网格搜索中使用管道

在网格搜索中使用管道的工作原理与使用任何其他估计器都相同。 我们定义一个需要搜索的参数网络,并利用管道和参数网格构建一个GridSearchCV。不过在指定参数网格时存在一处细微的变化。我们需要为每个参数指定它在管道中所属的步骤。我们要调节的两个参数C和gamma…

NGINX+KEEPALIVED | 一文搞懂NG+KL负载均衡高可用架构的实操教程(详细)

文章目录 NGINXKEEPALIVED负载均衡高可用架构为什么需要多节点应用为什么需要Nginx服务为什么需要Keepalived服务NGKL简述前期准备Linux服务器公共环境配置Server1 NGKL服务器配置Server2 NGKL服务器配置Server3 HTTP服务器配置Server4 HTTP服务器配置运行测试用例 NGINXKEEPAL…

Android选择题界面的设计——线性布局实操

目录 任务目标任务分析任务实施 任务目标 使用TextView、Button、CheckBox等实现一个选择题界面,界面如图1所示。 图1 选择题界面效果图 任务分析 上述界面可以分解为上下两部分,上面部分可以使用横向的线性布局来完成,下面部分可以使用…

WPF真入门教程34--爆肝了【仓库管理系统】

1、项目介绍 本项目是一个基于C#WPF实现的仓库管理系统,系统规模较小,适合入门级的项目练练手,但项目还是具有较高的学习价值,它采用mvvmlight框架,EF框架,WPF前端等技术构成。对于学习来说,可…

2024科技文化节程序设计竞赛

补题链接 https://www.luogu.com.cn/contest/178895#problems A. 签到题 忽略掉大小为1的环&#xff0c;答案是剩下环的大小和减环的数量 #include<bits/stdc.h> #include<iostream> #include<cstdio> #include<vector> #include<map> #incl…

基于深度学习网络的USB摄像头实时视频采集与火焰检测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 将usb摄像头对准一个播放火焰的显示器&#xff0c;然后进行识别&#xff0c;识别结果如下&#xff1a; 本课题中&#x…

巴图自动化Profinet协议转Modbus协议网关模块连接智能仪表与PLC通讯

一、功能及优势&#xff1a;巴图自动化Profinet协议转Modbus协议网关模块&#xff08;BT-MDPN10&#xff09;的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。Profinet协议转Modbus协议网关模块&#xff08;BT-MDPN10&#xff09;集成了Modbus和Profinet两种协议以…

linux——IPC 进程间通信

IPC 进程间通信 interprocess communicate IPC&#xff08;Inter-Process Communication&#xff09;&#xff0c;即进程间通信&#xff0c;其产生的原因主要可以归纳为以下几点&#xff1a; 进程空间的独立性 资源隔离&#xff1a;在现代操作系统中&#xff0c;每个进程都…

《野孩子》:撤档背后的故事与思考

《野孩子》&#xff1a;撤档背后的故事与思考 2024年7月&#xff0c;一部备受期待的电影《野孩子》原定于全国上映&#xff0c;却因后期进度原因不得不宣布撤档。这部电影由知名导演殷若昕执导&#xff0c;当红小生王俊凯领衔主演&#xff0c;讲述了两个命运相似的少年相依为命…

“proxy_pass“ directive is duplicate

后面发现是nginx.conf里面proxy pass这里有两个&#xff0c;注释其中一个并重新运行即可&#xff01;

【QT】常用控件|QLabel|QLCDNumber|QProgressbar|QCalenderWidget

目录 ​编辑 QLabel 核心属性 testFormat 自适应pixmap 文本对齐&#xff0c;换行 Buddy QLCDNumber 核心属性 倒计时 处理槽函数 QProgressbar 核心属性 QCalendarWidget 核心属性 核心信号 QLabel 用来显示文本和图片 核心属性 属性作用textFormat 文本的格…

CSS-实例-div 水平居中 垂直靠上

1 需求 2 语法 3 示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>表格水平居中、垂直靠上示例…

2023年问界M9 EV 问界M9增程维修手册和电路图线路图资料更新

此次更新了2023年问界M9 EV及问界M9增程维修手册和电路图资料&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表位置等等&#…

python-计算矩阵边缘元素之和(赛氪OJ)

[题目描述] 输入一个整数矩阵&#xff0c;计算位于矩阵边缘的元素之和。 所谓矩阵边缘的元素&#xff0c;就是第一行和最后一行的元素以及第一列和最后一列的元素。输入&#xff1a; 输入共 m 1 行。 第一行包含两个整数 m, n (1 < m,n < 100) &#xff0c;分别为矩阵的…

力扣双指针算法题目:移动零

1.题目 . - 力扣&#xff08;LeetCode&#xff09; 2.思路解析 这个题目的思路和“使用递归排序快速排序解决数组的排序问题”相同 class solution { public:void QuickSort(vector<int>& nums, int left, int right){if (left > right) return;int key left…

邮件发送失败DKIM报错问题排查解决的方案?

邮件发送DKIM验证失败的排查方法&#xff1f;DKIM的设置步骤&#xff1f; DKIM作为一种验证机制&#xff0c;帮助确保电子邮件的发件人身份验证和邮件内容完整性。然而&#xff0c;发信时可能会遇到DKIM相关的问题&#xff0c;导致邮件发送失败或报错。AokSend将探讨常见的邮件…

电脑端适用何种便签app 精选电脑桌面便签推荐

在数字化时代&#xff0c;电脑已成为我们日常办公不可或缺的工具。在使用电脑办公的同时&#xff0c;我们经常需要随时记录一些重要信息或工作事项。此时&#xff0c;如果能有一款便捷、高效的桌面便签软件&#xff0c;无疑会大大提升我们的工作效率。想象一下&#xff0c;在繁…

SimpleDateFormat 处理带有毫秒的时间字符串转化为时间不准的问题

SimpleDateFormat 处理带有微秒的字符串转化为时间会导致不准确 下面是代码示例&#xff1a; public static void main(String[] args) throws Exception{String timeStampStr "2024-07-04 10:11:34.800017";System.out.println("带毫秒的时间格式: " …