matlab代码--卷积神经网络的手写数字识别

1.cnn介绍

卷积神经网络(Convolutional Neural Network, CNN)是一种深度学习的算法,在图像和视频识别、图像分类、自然语言处理等领域有着广泛的应用。CNN的基本结构包括输入层、卷积层、池化层(Pooling Layer)、全连接层(Fully Connected Layer)和输出层。其中,卷积层通过一系列可学习的滤波器(或称核)扫描输入数据,旨在检测特定的局部特征。这些滤波器能够自动学习并提取图像中的边缘、纹理和形状等低层次特征,以及更复杂的高层次特征。
卷积神经网络的核心特性包括局部连接、权值共享和池化。局部连接意味着每个神经元只与输入数据的局部区域相连,这有助于捕捉图像的局部特征。权值共享则大大减少了网络参数的数量,降低了模型的复杂度和计算量,同时提高了模型的泛化能力。池化层则通过下采样操作(如最大池化或平均池化)进一步减少数据的维度,保留重要特征并减少过拟合的风险。这些特性使得CNN在处理高维数据(如图像)时具有显著的优势和效率。
卷积神经网络在诸多领域都取得了显著的成果。在图像分类任务中,CNN能够准确识别并分类各种物体和场景。在目标检测领域,基于CNN的方法如YOLO(You Only Look Once)和Faster R-CNN等实现了高效且准确的目标检测。此外,CNN还在人脸识别、语音识别、自动驾驶和医疗影像分析等领域展现出了巨大的潜力。随着深度学习技术的不断发展,卷积神经网络也在持续演进,如引入残差网络(ResNet)、卷积神经网络与循环神经网络的结合(如CRNN)等新型网络结构,以及通过迁移学习、深度学习框架优化等技术进一步提升其性能和应用范围。

2.cnn介绍

手写数字MNIST数据库由60000个示例的训练集和10000个示例的测试集组成。这些数字已进行归一化,每个示例是28*28像素的图片,图片是黑底白字,每个图片的标签就是图片上的数字,数字范围是0~9,总共10各分类标签。对于那些想在真实世界的数据上尝试学习模式识别方法,同时在预处理和格式化上花费最少精力的人来说,这是一个很好的数据库。其下载网址为附官网网址:http://yann.lecun.com/exdb/mnist/
在官网上下载的mnist数据集格式是这样的,包含4个文件:
train-images-idx3-ubyte.gz: training set images (9912422 bytes)
train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)
这里,4个文件分别表示训练图像集(预测变量)、训练标签集(响应变量)、测试图像集、测试标签集。
简单来说,这是一种类似二进制格式的数据,为什么使用这种格式,我想可能是为了压缩数据大小,方便下载和传输吧,如果直接使用图片存储格式,7万张图片的压缩包有多大。

将原始格式转换为常用的图片格式,代码如下,

clear,clc,close all
%% 01 首先提取训练图片集
filename='train-images-idx3-ubyte';
%读取文件头信息,并转换
fid=fopen(filename);
magic1=fread(fid,4);
num1=fread(fid,4);
row1=fread(fid,4);
colomn1=fread(fid,4);
magic1=zhuanhuan(magic1)
num1=zhuanhuan(num1)
row1=zhuanhuan(row1)
colomn1=zhuanhuan(colomn1)
%读取图片像素单点数据,并重构图片数据结构
trainimages=cell(num1,1);
for i=1:num1
    temp=fread(fid,row1*colomn1);
    temp=reshape(temp,[row1,colomn1]);
    trainimages {i}=temp';
end
fclose(fid);
%读取完毕,读取后的图片数据存储在trainimages变量中
%随便查看一下第5张图片,确认提取无误
for i=1:5
imshow(trainimages{i})
hold on
end
%% 02 读取训练标签集
filename='train-labels-idx1-ubyte';
%读取文件头信息,并转换
fid=fopen(filename);
magic2=fread(fid,4);
num2=fread(fid,4);
magic2=zhuanhuan(magic2)
num2=zhuanhuan(num2)
%读取标签数据,不需要数据重构,直接赋值和存储到trainlabels变量中即可
trainlabels=zeros(num2,1);
for i=1:num2
    trainlabels(i)=fread(fid,1);
end
fclose(fid);
%查看下前面5个标签数据,确认提取无误
trainlabels(1:5)

%% 03 把上面提取好的trainimages存储成外部图片文件
%总共6万个图片,使用for循环读取和存出,注意,相同类别的图片存储到相同命名文件下面。例如标签0的所有图片存储到子文件0下面。最终形成0~9共10个子文件夹。
for index=1:num1
    img=trainimages{index};
    label=num2str(trainlabels(index));
    path=fullfile('./','bmp',label,...
        ['img',label,num2str(index),'.png']);
    %imwrite(img,path);
end

%% 04 把上面提取好的trainimages和trainlabels存储成外部mat文件,命名为mnist0。
% save mnist0.mat trainimages trainlabels

% 转换的函数,上面程序代码调用
function y=zhuanhuan(data)
    b=dec2bin(data,8);
    c=[b(1,:),b(2,:),b(3,:),b(4,:)];
    y=bin2dec(c);
end

在这里插入图片描述

matlab实现

CNN基本组成:输入层、隐藏层、输出层。但隐藏层分为:卷积层 + 池化层
1.输入层
为一张原始的图片,尺寸为28*28
2.卷积层
通过使用一系列可学习的滤波器(或称为卷积核)来扫描输入图像,提取图像的局部特征。这些滤波器能够捕捉到图像中的边缘、纹理等基本特征。用于提取图像的局部特征.
3.池化层
用于降低特征的空间维度,减少参数数量和计算量,提高网络的鲁棒性。常见的池化操作有最大池化(Max Pooling)和平均池化(Average Pooling)、
4.全连接层
在卷积和池化层之后,网络会包含一个或多个全连接层,将卷积层和池化层提取的特征映射到高维空间,以便进行分类。最后一层将学习到的特征映射到最终输出,如分类标签。.
5输出层
是一个softmax层,用于将全连接层的输出转换为概率分布,从而实现多类别分类,这里我们需要实现10个目标的分类。
首先,使用MATLAB自带的神经网络工具箱,对手写数字识别问题进行分类识别,训练中设置不同的最小批次参数。
使用的卷积网络结构如下

部分代码:

%卷积层
layers = [
    imageInputLayer([28 28 1],"Name","imageinput")
    convolution2dLayer([5 5],10,"Name","conv_1","Padding","same")
    batchNormalizationLayer("Name","batchnorm_1")
    tanhLayer("Name","tanh_1")
    averagePooling2dLayer([5 5],"Name","avgpool2d_1","Padding","same")
    convolution2dLayer([5 5],10,"Name","conv_2","Padding","same")
    batchNormalizationLayer("Name","batchnorm_2")
    tanhLayer("Name","tanh_2")
    averagePooling2dLayer([5 5],"Name","avgpool2d_2","Padding","same")
    fullyConnectedLayer(10,"Name","fc")
    softmaxLayer("Name","softmax")
classificationLayer("Name","classoutput")];
 

训练参数如下所示
% 设置训练参数
opts = trainingOptions('sgdm', ...
    'InitialLearnRate',0.01, ...%初始学习率
    'Shuffle','every-epoch', ...
    'MaxEpochs',3,...%最大训练轮数
    'ValidationData', test, ...
    'ValidationFrequency',150,...%测试频率
    'MiniBatchSize',200,... %minibatch大小
    'Verbose',false, ...
    'Plots','training-progress');

在这里插入图片描述
通过自己手动实现卷积神经网络的过程,其过程包括,
1.定义网络结构
卷积层:定义卷积核的大小、数量和步长。卷积层通过滑动窗口的方式对输入图像进行特征提取。
激活函数:在卷积层之后,通常会应用一个非线性激活函数,本文使用ReLU函数,这有助于增加网络的非线性特性。
池化层:池化层(如最大池化)用于减少特征图的维度,降低计算复杂度,并提高模型的平移不变性。
全连接层:在卷积层和池化层之后,通常会添加一到两层全连接层,用于对提取的特征进行高级别的推理。
2.前向传播
卷积操作:对于输入图像和每个卷积核,执行卷积操作以生成特征图。
激活函数:将卷积层的输出通过激活函数。
池化操作:对激活后的特征图进行池化操作。
全连接层:将池化层的输出展平成一个向量,并输入到全连接层中进行计算。
3.损失函数和优化器
损失函数:定义损失函数,本文使用交叉熵损失函数,用于衡量模型的预测结果与真实标签之间的差距。
优化器:选择优化器,本文使用随机梯度下降(SGD)优化器,用于更新模型的权重和偏置,以最小化损失函数。
4. 反向传播
计算梯度:根据损失函数,计算每一层参数的梯度。
更新参数:使用优化器更新模型的权重和偏置。
5. 训练模型
迭代训练:将数据集分成训练集和测试集,使用训练集进行多次迭代训练。在每次迭代中,执行前向传播、计算损失、反向传播和更新参数的步骤。
6.验证性能:在每次迭代或每几个迭代后,使用测试集评估模型的性能。

自己手写cnn,得到的训练效果如下
在这里插入图片描述

完整代码获取:这里

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

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

相关文章

挑战用React封装100个组件【004】

项目地址 https://github.com/hismeyy/react-component-100 组件描述 组件适用于展示图片的地方,提供了small,medium,large三种大小。可以删除图片,也可以全屏预览图片。 样式展示 前置依赖 今天我们的这个挑战需要用用到了…

【详细介绍及演示】Flink之checkpoint检查点的使用

目录 一、介绍 二、 设置checkpoint检查点演示 1、 代码演示 2、测试代码效果 3、查看快照情况 ​编辑 三、在集群上运行 1、第一次运行 2、第二次运行 四、自定义检查点savePoint 1、提交一个flink job 打成jar包 2、输入一些数据,观察单词对应的数字的…

【进阶篇-Day15:JAVA线程-Thread的介绍】

目录 1、进程和线程1.1 进程的介绍1.2 并行和并发1.3 线程的介绍 2、JAVA开启线程的三种方法2.1 继承Thread类:2.2 实现Runnable接口2.3 实现Callable接口2.4 总结: 3、线程相关方法3.1 获取和设置线程名字的方法3.2 线程休眠方法:3.3 线程优…

springboot(20)(删除文章分类。获取、更新、删除文章详细)(Validation分组校验)

目录 一、删除文章分类功能。 (1)接口文档。 1、请求路径、请求参数。 2、请求参数。 3、响应数据。 (2)实现思路与代码书写。 1、controller层。 2、service接口业务层。 3、serviceImpl实现类。 4、mapper层。 5、后端接口测试。…

如何搭建JMeter分布式集群环境来进行性能测试

在性能测试中,当面对海量用户请求的压力测试时,单机模式的JMeter往往力不从心。如何通过分布式集群环境,充分发挥JMeter的性能测试能力?这正是许多测试工程师在面临高并发、海量数据时最关注的问题。那么,如何轻松搭建…

Y20030025基于php+mysql的幼儿健康管理系统设计与实现 源代码 配置 文档

幼儿健康管理系统的设计与实现 1.摘要2.开发目的和意义3.系统功能设计4.系统界面截图5.源码获取 1.摘要 在信息化时代的浪潮中,幼儿健康管理面临着前所未有的挑战与机遇。为了更好地满足家长和幼儿园对幼儿健康管理的需求,我们致力于开发一套基于PHP的幼…

时频转换 | Matlab基于垂直二阶同步压缩变换vertical second-order synchrosqueezing一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式基本介绍 时频转换 | Matlab基于垂直二阶同步压缩变换vertical second-order synchrosqueezing一维数据转二维图像方法 程序设计 clear clc % close all load x.mat % 导入数据 x

1.1 数据结构的基本概念

1.1.1 基本概念和术语 一、数据、数据对象、数据元素和数据项的概念和关系 数据:是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。 数据是计算机程序加工的原料。 数据对象:是具有相同性质的数据元素的集合&…

SpringBoot小知识(2):日志

日志是开发项目中非常重要的一个环节,它是程序员在检查程序运行的手段之一。 1.日志的基础操作 1.1 日志的作用 编程期调试代码运营期记录信息: * 记录日常运营重要信息(峰值流量、平均响应时长……) * 记录应用报错信息(错误堆栈) * 记录运维过程数据(…

传输控制协议(TCP)

传输控制协议是Internet一个重要的传输层协议。TCP提供面向连接、可靠、有序、字节流传输服务。 1、TCP报文段结构 注:TCP默认采用累积确认机制。 2、三次握手、四次挥手 (1)当客户向服务器发送完最后一个数据段后,发送一个FIN段…

输出保留3位小数的浮点数

输出保留3位小数的浮点数 C语言代码C代码Java代码Python代码 💐The Begin💐点点关注,收藏不迷路💐 读入一个单精度浮点数,保留3位小数输出这个浮点数。 输入 只有一行,一个单精度浮点数。 输出 也只有一…

安装 RabbitMQ 服务

安装 RabbitMQ 服务 一. RabbitMQ 需要依赖 Erlang/OTP 环境 (1) 先去 RabbitMQ 官网,查看 RabbitMQ 需要的 Erlang 支持:https://www.rabbitmq.com/ 进入官网,在 Docs -> Install and Upgrade -> Erlang Version Requirements (2) …

【竞技宝】CS2-上海major:MongoLZ成为亚洲之光

北京时间2024年12月1日,上海major在昨日正式拉开比赛序幕,首日第六轮迎来MongolZ对阵MIBR、COL对阵PUA。以下是本轮比赛的详细战报。 MongoLz 13-6 MIBR(比赛地图:远古遗迹) 上半场,MongoLz先做进攻方。手枪局,MongoLz抱团进攻遭遇MIBR重防被接连秒掉三人,然而在5V2的残局中,M…

【绘图】数据可视化(python)

对于数据绝对值差异较大(数据离散) 1. 对数坐标直方图(Histogram with Log Scale) import pandas as pd import matplotlib.pyplot as plt import numpy as np# 示例数据 data {count: [10, 20, 55, 90, 15, 5, 45, 80, 1000, …

MySQL - Why Do We Need a Thread Pool? - mysql8.0

MySQL - Why Do We Need a Thread Pool? - mysql8.0 本文主要由于上次写的感觉又长又臭, 感觉学习方法有问题, 我们这次直接找来了 thread pool 的原文,一起来看看官方的开发者给出的blog – 感觉是个大神 但是好像不是最官方的 &#xff0c…

【JS】栈内存、堆内存、事件机制区别

js中,内存主要分为两种类型:栈内存(stack)、堆内存(heap),两种内存区域在存储和管理数据时有各自的特点和用途。 栈内存 访问顺序 栈是先进后出、后进先出的数据结构,栈内存是内存用…

glog在vs2022 hello world中使用

准备工作 设置dns为阿里云dns 223.5.5.5,下载cmake,vs2022,git git clone https://github.com/google/glog.git cd glog mkdir build cd build cmake .. 拷贝文件 新建hello world并设置 设置预处理器增加GLOG_USE_GLOG_EXPORT;GLOG_NO_AB…

20241127 给typecho文章编辑附件 添加视频 图片预览

Typecho在写文章时,如果一次性上传太多张图片可能分不清哪张,因为附件没有略缩图,无法实时阅览图片,给文章插入图片时很不方便。 编辑admin/file-upload.php 大约十八行的位置 一个while 循环里面,这是在进行html元素更新操作,在合…

重生之我在异世界学编程之C语言:二维数组篇

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一 二维数组的创建1. 二维数组的…

Tree搜索二叉树、map和set_数据结构

数据结构专栏 如烟花般绚烂却又稍纵即逝的个人主页 本章讲述数据结构中搜索二叉树与HashMap的学习,感谢大家的支持!欢迎大家踊跃评论,感谢大佬们的支持! 目录 搜索二叉树的概念二叉树搜索模拟实现搜索二叉树查找搜索二叉树插入搜索二叉树删除…