Matlab搭建AlexNet实现手写数字识别
Matlab搭建AlexNet实现手写数字识别
个人博客地址
文章目录
- Matlab搭建AlexNet实现手写数字识别
- 环境
- 内容
- 步骤
- 准备MNIST数据集
- 数据预处理
- 定义网络模型
- 定义训练超参数
- 网络训练和预测
- 代码下载
环境
- Matlab 2020a
- Windows10
内容
使用Matlab对MNIST数据集进行预处理,搭建卷积神经网络进行训练,实现识别手写数字的任务。在训练过程中,每隔30个batch输出一次模型在验证集上的准确率和损失值。在训练结束后会输出验证集中每个数字的真实值、网络预测值和判定概率,并给出总的识别准确率。
步骤
准备MNIST数据集
为了方便进行测试,本次只选用500张MNIST数据集,每个数字50张。
下载数据集后并解压,为每个数字创建单独文件夹并将该数字的所有图片放在对应的文件夹下,如图1所示。
数据集下载地址 提取码:af6n

手动分类结束后每个文件夹中应有50张图片。
数据预处理
% 加载数据集
imds = imageDatastore(..."./data",...'IncludeSubfolders', true,...'LabelSource','foldernames');
使用imageDatastore加载数据集。第一个参数填写数据集路径。由于本次实验data目录下含有子文件夹所以IncludeSubfolders需要指定为true。LabelSource表示标签来源,这里使用文件夹名字来代表标签。
ImageDatastore - 属性:Files: {'D:\data\0\0_1.bmp';'D:\data\0\0_10.bmp';'D:\data\0\0_11.bmp'... and 497 more}Folders: {'D:\data'}Labels: [0; 0; 0 ... and 497 more categorical]AlternateFileSystemRoots: {}ReadSize: 1SupportedOutputFormats: [1×5 string]DefaultOutputFormat: "png"ReadFcn: @readDatastoreImage
上面内容为执行imageDatastore后返回变量的属性。可以看出已经成功将数据集读入并对每张图片进行label处理。
由于每个数字有50张图像,因此本次实验每个数字选用30张进行训练,另20张进行验证。使用splitEachLabel进行划分,得到训练集和验证集。
% 数据打乱
imds = shuffle(imds);% 划分训练集和验证集。每一个类别训练集有30个,验证集有20个
[imdsTrain,imdsValidation] = splitEachLabel(imds, 30);
使用shuffle进行数据打乱。得到的imdsTrain和imdsValidation分别有300和200张图片。
% 将训练集与验证集中图像的大小调整成与输入层的大小相同
augimdsTrain = augmentedImageDatastore([28 28],imdsTrain);
augimdsValidation = augmentedImageDatastore([28 28],imdsValidation);
定义网络模型
% 构建alexnet卷积网络
alexnet = [imageInputLayer([56,56,1], 'Name', 'Input')convolution2dLayer([11,11],48,'Padding','same','Stride',4, 'Name', 'Conv_1')batchNormalizationLayer('Name', 'BN_1')reluLayer('Name', 'Relu_1')maxPooling2dLayer(3,'Padding','same','Stride',2, 'Name', 'MaxPooling_1')convolution2dLayer([5,5],128,'Padding',2,'Stride',1, 'Name', 'Conv_2')batchNormalizationLayer('Name', 'BN_2')reluLayer('Name', 'Relu_2')maxPooling2dLayer(3,'Padding','same','Stride',2, 'Name', 'MaxPooling_2')convolution2dLayer([3 3],192,'Padding',1,'Stride',1, 'Name', 'Conv_3')batchNormalizationLayer('Name', 'BN_3')reluLayer('Name', 'Relu_3')convolution2dLayer([3 3],192,'Padding',1,'Stride',1, 'Name', 'Conv_4')batchNormalizationLayer('Name', 'BN_4')reluLayer('Name', 'Relu_4')convolution2dLayer([3 3],128,'Stride',1,'Padding',1, 'Name', 'Conv_5')batchNormalizationLayer('Name', 'BN_5')reluLayer('Name', 'Relu_5')maxPooling2dLayer(3,'Padding','same','Stride',2, 'Name', 'MaxPooling_3')fullyConnectedLayer(4096, 'Name', 'FC_1')reluLayer('Name', 'Relu_6')fullyConnectedLayer(4096, 'Name', 'FC_2')reluLayer('Name', 'Relu_7')fullyConnectedLayer(10, 'Name', 'FC_3') % 将新的全连接层的输出设置为训练数据中的种类softmaxLayer('Name', 'Softmax') % 添加新的Softmax层classificationLayer('Name', 'Output') ]; % 添加新的分类层
使用上面的代码即可构建AlexNet模型。
% 对构建的网络进行可视化分析
lgraph = layerGraph(mynet);
analyzeNetwork(lgraph)

定义训练超参数
% 配置训练选项
options = trainingOptions('sgdm', ...'InitialLearnRate',0.001, ... 'MaxEpochs',100, ... 'Shuffle','every-epoch', ...'ValidationData',augimdsValidation, ...'ValidationFrequency',30, ...'Verbose',true, ...'Plots','training-progress');
本次实验选用sgdm作为优化器,初始学习率设置为0.001,最大迭代次数为100,每次迭代都会打乱数据,每隔30个batch进行一次验证。
网络训练和预测
% 对网络进行训练
net = trainNetwork(augimdsTrain, mynet, options); % 将训练好的网络用于对新的输入图像进行分类,得到预测结果和判定概率
[YPred, err] = classify(net, augimdsValidation);
其中,YPred是存放网络对验证集预测结果的数组,err存放着每个数字的判定概率。

% 打印真实数字、预测数字、判定概率和准确率
YValidation = imdsValidation.Labels;
for i=1:200
fprintf("真实数字:%d 预测数字:%d", double(YValidation(i,1))-1, double(YPred(i, 1))-1);
fprintf(" 判定概率:%f\n", max(err(i, :)));
end
运行上面代码即可打印相关结果。
... ...
真实数字:4 预测数字:4 判定概率:0.814434
真实数字:0 预测数字:0 判定概率:0.657829
真实数字:8 预测数字:8 判定概率:0.874560
真实数字:0 预测数字:0 判定概率:0.988826
真实数字:6 预测数字:6 判定概率:0.970034
... ...
真实数字:5 预测数字:5 判定概率:0.806220
真实数字:4 预测数字:4 判定概率:0.938233
真实数字:7 预测数字:7 判定概率:0.906994
真实数字:7 预测数字:7 判定概率:0.837794
真实数字:6 预测数字:6 判定概率:0.951572
真实数字:6 预测数字:1 判定概率:0.415834
真实数字:5 预测数字:5 判定概率:0.789031
真实数字:2 预测数字:2 判定概率:0.363526
真实数字:7 预测数字:7 判定概率:0.930049准确率:0.880000
代码下载
GitHub下载
相关文章:
Matlab搭建AlexNet实现手写数字识别
Matlab搭建AlexNet实现手写数字识别 个人博客地址 文章目录Matlab搭建AlexNet实现手写数字识别环境内容步骤准备MNIST数据集数据预处理定义网络模型定义训练超参数网络训练和预测代码下载环境 Matlab 2020aWindows10 内容 使用Matlab对MNIST数据集进行预处理,搭建…...
比较全面的HTTP和TCP网络传输的单工、全双工和半双工
文章目录单工、全双工、半双工1. 单工2. 半双工3. 全双工HTTP协议的工作模式TCP协议的工作模式本文参考: 图解网络传输单工、半双工、全双工 - 知乎 (zhihu.com) 问:HTTP是单工的还是双工的还是半双工的 - 简书 (jianshu.com) 关于TCP全双工模式的解释_忙…...
CSS Houdini
前言 最近看了几篇文章,是关于 CSS Houdini 的。作为一个前端搬砖的还真不知道这玩意,虽然不知道的东西挺多的,但是这玩意有点高大上啊。 Houdini 是一组底层 API,它们公开了 CSS 引擎的各个部分,从而使开发人员能够通…...
C++引用
这里写目录标题引用引用的基本使用引用做函数参数引用作为函数返回值引用的本质常量引用引用与指针的区别&的三种作用引用 引用的基本使用 作用: 给变量起别名 语法: 数据类型 &别名 原名 引用的本质是给变量起别名,因此࿰…...
YOLOv6-目标检测论文解读
文章目录摘要问题算法网络设计BackboneNeckHead标签分配SimOTA(YOLOX提出):TAL(Task alignment learning,TOOD提出)损失函数分类损失框回归损失目标损失行业有用改进自蒸馏图像灰度边界填充量化及部署实验消…...
【factoryio】使用SCL编写 <机械手控制> 程序
使用虚拟工厂软件和博图联合仿真来编写【scl】机械手控制程序 文章目录 目录 文章目录 前言 二、程序编写 1.机械手运行部分 2.启动停止部分 3.急停复位部分 三、完整代码 总结 前言 在前面我们一起写过了许多案例控制的编写,在这一章我们一起来编写一下一个…...
QT学习记录散件
fromLocal8Bit() qt中fromLocal8Bit()函数可以设置编码。 因为QT默认的编码是unicode,不能显示中文的 而windows默认使用(GBK/GB2312/GB18030) 所以使用fromLocal8Bit()函数,可以实现从本地字符集GB到Unicode的转换,从…...
[SSD科普之1] PCIE接口详解及应用模式
PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准,它原来的名称为“3GIO”,是由英特尔在2001年提出的,旨在替代旧的PCI,PCI-X和AGP总线标准。一、PCI-E x1/x4/x8/x16插槽模式PCI-E有 x1/…...
Linux设备驱动模型与 sysfs实现分析
RTOS和Linux系统上开发驱动的方式非常的不同,在RTOS系统下,驱动和驱动之间并没有实质性的联系,不同的驱动和BSP之间仅仅通过一层很薄很薄的设备管理框架聚合在一起构成RTOS的设备管理子系统。图形化表示如下: 设备驱动&BSP之间互相独立,互不影响,互不依赖,独立实现,…...
软考高级之制定备考计划
制定备考计划 高项准备时间最好是三个月以上,分为三个阶段来复习。 第一个阶段——熟悉知识点 第二个阶段——刷题 第三个阶段——冲刺复习 具体操作 第一个阶段 这个阶段的复习以教材和视频为主,掌握重要知识点。基础知识要打牢。例如࿱…...
[Pytorch] Linear层输出nan
参考链接: https://discuss.pytorch.org/t/well-formed-input-into-a-simple-linear-layer-output-nan/74720/11 总结原因: numpy需要更新 PS. 查看numpy版本号 打开Anaconda Prompt 进入环境 输入命令conda activate envname 然后输入pip show numpy…...
2023-2-19-What is ‘ template<typename E, E V> ‘?
目录C里面template怎么用inline函数模板类模板函数模板特化C里面template怎么用 template是什么? template其实是C的一种语法糖,本意是去简化程序员的工作. void swap(int *a,int *b){int temp *a;*a *b;*b temp; }比如在写一个交换函数的的时候,参数为两个in…...
华为OD机试题 - 字符串加密(JavaScript)
最近更新的博客 华为OD机试题 - 任务总执行时长(JavaScript) 华为OD机试题 - 开放日活动(JavaScript) 华为OD机试 - 最近的点 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试题 - 最小步骤数(JavaScript) 华为OD机试题 - 任务混部(JavaScript) 华为OD机试题 - N 进…...
美团前端一面手写面试题
实现斐波那契数列 // 递归 function fn (n){if(n0) return 0if(n1) return 1return fn(n-2)fn(n-1) } // 优化 function fibonacci2(n) {const arr [1, 1, 2];const arrLen arr.length;if (n < arrLen) {return arr[n];}for (let i arrLen; i < n; i) {arr.push(arr[…...
2D图像处理:缺陷检测--仿照Halcon的Variation Model
文章目录 基于 C++&Opencv 的检测结果(Robust模式-MAD)一、Variation Model1.1 准备和训练模型方法1.2 比较模板方法1.3 过滤(保留符合缺陷特征的区域)二、参考基于 C++&Opencv 的检测结果(Robust模式-MAD) 一、Variation Model Halcon中的Variation Model主要是将待…...
JavaScript 注释
JavaScript 注释可用于提高代码的可读性。JavaScript 注释JavaScript 不会执行注释。我们可以添加注释来对 JavaScript 进行解释,或者提高代码的可读性。单行注释以 // 开头。本例用单行注释来解释代码:实例// 输出标题:document.getElementB…...
浅谈使用CDN加速的OSS
目录引出OSS对象存储服务CDNCDN加速OSS资源总结引出 之前,我在写项目的时候,因为项目中存在音视频的存储,然后我看圈子里面的人都是使用OSS对象存储来处理,然后我也跟风去使用了,然后在之后,我一个朋友问我…...
华为OD机试题 - 服务依赖(JavaScript)
最近更新的博客 华为OD机试题 - 任务总执行时长(JavaScript) 华为OD机试题 - 开放日活动(JavaScript) 华为OD机试 - 最近的点 | 备考思路,刷题要点,答疑 【新解法】 华为OD机试题 - 最小步骤数(JavaScript) 华为OD机试题 - 任务混部(JavaScript) 华为OD机试题 - N 进…...
整合K8s+SpringCloudK8s+SpringBoot+gRpc
本文使用K8s当做服务注册与发现、配置管理,使用gRpc用做服务间的远程通讯一、先准备K8s我在本地有个K8s单机二、准备service-providerpom<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.…...
Django框架之模型视图--HttpResponse对象
HttpResponse对象 视图在接收请求并处理后,必须返回HttpResponse对象或子对象。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。 1 HttpResponse 可以使用django.http.HttpResponse来构造响应对象。 HttpResponse(content响应体, con…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
