使用MATLAB快速搭建神经网络实现分类任务(模式识别)(附源码)

2023-10-30

使用神经网络能执行几种典型的任务:聚类、拟合、分类(模式识别)以及时间序列预测。

其中分类任务可以说是最常应用的场景之一,在之前的文章里也使用了分类任务作为案例对神经网络进行了入门讲解。

时常遇到想要使用神经网络快速地实现分类的同学。

今天就讲一讲怎么用MATLAB快速地完成吧。

1.准备数据

这里使用MNIST数据集作为案例。

MNIST是一个很有名的手写数字识别数据集。对于每张照片,都是以一个28*28的矩阵存储的,数据“展平”之后是一个长度为784的一维数据。

MNIST数据集数字0~9示例

数据分为四组:

TRAIN_images:训练集输入数据,维度为60000*784。其中60000代表训练集共有60000组数据(批次数bench)。

TRAIN_labels:训练集的标签数据,维度为60000*10,其中的10代表的数字0~9共有10种类型。比如数字0使用[1 0 0 0 0 0 0 0 0 0]代表,数字1使用[0 1 0 0 0 0 0 0 0 0]代表,以此类推。

TEST_images:测试集输入数据,维度为10000*784

TEST_labels:训练集的标签数据,维度为10000*10

其中训练集是用于训练神经网络,测试集用于验证神经网络分类的优劣度(正确率)。

需要注意的是,有的时候标签值不是以矩阵的形式表示的,而是以0~9这样的类别数字表示的。这时候需要对标签类型进行转换,博主写了这样一个函数:

function label = class2label(class)
% 将class转为label
% 例如将[3,2,1,1]转换为[0,0,1;0,1,0;1,0,0;1,0,0]
% 输入:
% class 为类别数据,一维数据
% 输出:
% label 为多维矩阵,一行为一个标签,共n行,即n个标签
% 示例:label = class2label([3,2,1,1])

同样从矩阵形式转变为数字类别形式也有,这两个函数时常会用到:

function class = label2class(label)
% 将label转为class
% 例如将[0,0,1;0,1,0;1,0,0;1,0,0]转换为[3,2,1,1]
% 输入:
% label 为多维矩阵,一行为一个标签,共n行,即n个标签(一定要注意输入的label的维度正确)
% 输出:
% class 为分类结果,行向量,一维数据
% 示例:class = label2class([0,0,1;0,1,0;1,0,0;1,0,0])

2.初始化神经网络

patternnet是MATLAB内置的用于对目标类别进行分类的神经网络。使用patternnet时的标签值必须是矩阵形式的。该函数的使用方法比较简单,如下图所示:

% 2.初始化神经网络
hiddenSizes = 120;                   %隐藏层数
net = patternnet(hiddenSizes);       %初始化模式识别神经网络
view(net)                            %查看神经网络结构

此时神经网络的结构如下图,可以看出隐藏层的激活函数默认的是tansig,该激活函数是可以更换的。

模式识别神经网络结构

3.训练神经网络

MATLAB使用train函数训练浅层神经网络。训练神经网络的指令也可以说是很简单了,不过需要注意的是训练数据的行列方向。

训练集输入数据是R*Q的矩阵,R为特征维度,Q为批次数,训练集标签数据是U*Q的矩阵,U为标签种类数,Q为批次数。如果不是这样的方向则需要对数据进行转置。

如下述语句对数据就进行了转置。

% 3.训练神经网络
net = train(net,TRAIN_images',TRAIN_labels'); %训练网络

4.使用测试集进行分类

这步中使用了测试集进行了分类测试,并与真实的分类值进行对比,得到分类的正确率,代码如下:

% 4.使用测试集进行分类
testLen = 10000;                            %测试集长度
val = sim(net,TEST_images');                %计算测试集分类结果
classes = vec2ind(val);                     %将分类结果转换为class
r = sum(classes == label2class(TEST_labels'))/(testLen);  %计算正确率
disp(['模式识别的正确率为',num2str(r)])                   %打印结果

分类的结果为:

96.69%算是差强人意的正确率,通过优化还可以将正确率进一步提升。例如在第二部分的代码后加入这样两行代码:

net.layers{1}.transferFcn = 'logsig';  %将激活函数改为sigmod
net.trainFcn = 'traincgf';             %将训练函数换为traincgf

关于激活函数和训练函数更多的说明可以看这里:神经网络“分类”工具使用手册

此时分类结果为:

正确率有所提升,同学们可以再优化隐藏层数、激活函数、训练函数以及net的更多属性获取更好的分类效果。

5.封装

上述流程可以封装为一个函数文件,通过该函数文件可以快速实现分类任务的神经网络训练以及分类性能测试。

而你需要做的只是把数据准备好即可。

封装好的函数的说明如下:

function [net,r] = fastPatternnet(dTrain,dTrainLabel,dTest,dTestLabel,hiddenSizes,auto,set)
% 快速模式识别(分类)神经网络,可以自主设定训练集比例,并得到测试集分类正确率
% 输入:
% dTrain:神经网络输入的训练集,R*Q的矩阵,R为特征维度,Q为批次数,输入该变量时一定要注意行列方向是否正确
% dTrainLabel:神经网络的标签值,U*Q的矩阵,U为标签种类数,Q为批次数,输入该变量时一定要注意行列方向是否正确
% dTest:神经网络输入的测试集,R*Q的矩阵,R为特征维度,Q为批次数,输入该变量时一定要注意行列方向是否正确
% dTestLabel:神经网络输入的测试集,R*Q的矩阵,R为特征维度,Q为批次数,输入该变量时一定要注意行列方向是否正确
% hiddenSizes:神经网络隐藏层数
% auto:是否进行自动纠错,'on'为是,否则为否。开启自动纠错后会智能调整训练、测试集的行列方向。
% set:网络的额外设置,具体设置见:神经网络“分类”工具使用手册 | 工具箱文档
% 输出:
% net:训练完成的神经网络
% r:使用测试集得到的模式识别正确率,1对应100%正确

获取数据集和代码请看这里:

神经网络“分类”工具文档(公开版) | 工具箱文档

获取封装好的函数及其说明文档请看这里:

神经网络“分类”工具手册(完整版) | 工具箱文档

欢迎关注我的公众号“看海的城堡”,公众号里可能还会有更多有趣的东西分享。

后续可能还会补充聚类、拟合和时间序列预测的MATLAB快速实现方法~

分类无处不在

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用MATLAB快速搭建神经网络实现分类任务(模式识别)(附源码) 的相关文章

随机推荐

  • 归并排序 mergeSort

    归并排序 mergeSort 基本概念 归并排序的实现 时间复杂度 和 空间复杂度 稳定性 基本概念 将一个数组不断的二分 直到不能分为止 然后将不断对比合并 归并排序适用于链表 不需要额外的储存空间 但是对于数组 需要额外的储存空间 归并
  • push本地代码到gitlab出错

    push本地代码到gitlab出错 刚创建的gitlab版本库 在push代码时出错 git push u origin master To git github com Demo git rejected master gt master
  • getaddrinfo函数解析

    IPv4中使用gethostbyname 函数完成主机名到地址解析 这个函数仅仅支持IPv4 且不允许调用者指定所需地址类型的任何信息 返回的结构只包含了用于存储IPv4地址的空间 IPv6中引入了getaddrinfo 的新API 它是协
  • mysql jdbc 连接串_Mysql JDBC 连接串参数说明

    MySQL的 JDBC URL 格式 for Connector J 如下例 jdbc mysql host port host port database 参数名1 参数值1 参数名2 参数值2 现只列举几个重要的参数 如下表所示 参数说
  • python函数装饰器

    文章目录 一 简单了解装饰器 二 装饰器练习 三 多个装饰器 四 装饰器拓展 1 基础版 无参数的装饰器 2 升级版 有参数的装饰器 一 简单了解装饰器 装饰器 Decorators 是 Python 的一个重要部分 简单地说 他们是修改其
  • Lua基础之coroutine(协程)

    概括 1 创建协程2 coroutine的函数3 coroutine的基本流程4 yield对coroutine流程的干预5 resume function 以及yield之间的参数传递和返回值传递 原文地址 http blog csdn
  • 一文看懂Python系列之装饰器(decorator)(工作面试必读)

    Python的装饰器 decorator 可以说是Python的一个神器 它可以在不改变一个函数代码和调用方式的情况下给函数添加新的功能 Python的装饰器同时也是Python学习从入门到精通过程中必需要熟练掌握的知识 小编我当初学习Py
  • 单纯性法解有约束的线性规划问题

    程序功能 1 单纯性法解有约束的线性规划问题 2 标准形式的约束问题 目标函数求最小值 约束化为等式 引入松弛变量 变量全为非负 3 目标函数Z行系数全为非正数 则停止计算 RHS列对应系数为目标值x 化为标准形式之后 形参的意义 4 A是
  • 如何冻结模型,避免 model.train() 改变模型部分模块

    如何永久冻结参数 for name param in self llm model named parameters param requires grad False 虽然以上代码可以冻结模型参数 但无法保证冻结整个模型 model tr
  • gdb 调试子进程

    调试指令如下 gdb fork set follow fork mode child set detach on fork off b fork cpp 13 r 打断点可以打到fork的位置 这样就可以进入到子进程调试 follow fo
  • kali linux调整分区,kali linux 手动分区,不要再盲目的选自动  格式化自己的电脑...

    1 制作一个kali linux启动盘 2 将启动盘插入电脑选择 Grapical install 图形界面安装 附 Install 顾名思义那就是安装了 这是纯字符化界面的安装 Graphical install 这个是图形化界面的安装方
  • IDEA2020-Tomcat热部署两种方法(修改class后不用重启tomcat)

    第一种 第一种也是最常见的 修改为Update classes and resources 不过我的有Update classes and resources这个选项 设置之后 依旧没用 大家可以先康康这个 1 如图 选择Edit Conf
  • 遗传算法简介

    遗传算法简介1 美国Michigan大学的Holland教授及其学生收到生物模拟技术的启发 创造出了一种基于生物遗传和进化机制的适合与复杂系统优化的自适应概率优化技术 遗传算法 1967年 Holland的学生Bagley在其博士论文中首次
  • ESP32-CAM接收串口消息在串口输出

    static String comdata 串口接受数据 while Serial available gt 0 串口收到字符数大于零 comdata char Serial read if comdata 如果接受到数据 Serial p
  • linux调用海康.so

    1 下载SDK 2 把 so包放到一个目录 然后 pro包含 3 把头文件放进去 然后包含 4 上面做的qtcreato可以调用编辑了 如果在源目录下运行需要把库放到 usr lib 5 如果用gnome seiion开机启动还要把hc的文
  • 拉链表...

    目录 什么是拉链表 拉链表的作用 拉链表的形成 什么是拉链表 一张表存储的每一条信息就是一条记录的一个生命周期 这样的表格即为拉链表 拉链表的作用 用于记录一些 会发生变化但是变换频率不高的数据 比如某人的某个手机号使用情概况 通过对于日期
  • java IO学习笔记

    Java 流在处理上分为字符流和字节流 字符流处理的单元为 2 个字节的 Unicode 字符 分别操作字符 字符数组或字符串 而字节流处理单元为 1 个字节 操作字节和字节数组 Java 内用 Unicode 编码存储字符 字符流处理类负
  • 任务五-模型参数优化

    模型参数优化 使用网格搜索法对模型进行调优 调参时采用五折交叉验证的方式 并进行模型评估 网格搜索 网格搜索 其实可以叫穷举搜索 就是在所有候选的参数中 将不同参数组合起来 找出表现最好的一组参数 eg 以有两个参数的模型为例 参数a有3种
  • 导入别人的android studio项目

    在导入别人的android studio项目 假设为项目A 时 会遇到gradle不一致的情况 以下简短介绍解决方法 1 打开要导入的项目的目录 删除下图红框中的文件 2 找到自己以前在自己的android studio的任一项目 假设为项
  • 使用MATLAB快速搭建神经网络实现分类任务(模式识别)(附源码)

    使用神经网络能执行几种典型的任务 聚类 拟合 分类 模式识别 以及时间序列预测 其中分类任务可以说是最常应用的场景之一 在之前的文章里也使用了分类任务作为案例对神经网络进行了入门讲解 时常遇到想要使用神经网络快速地实现分类的同学 今天就讲一