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…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...