基本介绍

  • 软件:Matlab R2018b
  • 数据集:MNIST手写体数字数据集
  • 网络:自建简单网络

数据准备

MNIST数据集还挺有名的,这里就不过多介绍了。数据集本身读取格式官网有给,怎么转换成图片格式网上也有很多,这里不再赘述。
官网:http://yann.lecun.com/exdb/mnist/
训练集包含60000个示例,测试集包含10000个示例。
测试集的前5000个示例来自原始的NIST训练集。 最后的5000个来自原始的NIST测试集。 前5000个比后5000个更干净点,识别起来更容易。
当然为了方便使用MATLAB,这里给出程序缺省的数据集:
链接:https://pan.baidu.com/s/1VItI8MdUa-oBhWjKUUB72w
提取码:tgv9
CSDN地址:https://download.csdn.net/download/garker/12413315
每一个数字都包含1000张图片,每张图片大小均为28×28×1,1代表单通道,即灰度图。

神经网络组建

因为数据集本身特征并不多,所以不需要动用常用的神经网络,这里给出一个官方的结构形式。一共有15层。


这里可以看出,三层卷积,三层归一化,是相当简单的CNN网络结构了,可以当作CNN结构的入门学习好好钻研学习。
在MATLAB中的建构代码如下:

layers = [imageInputLayer([28 28 1])convolution2dLayer(3,8,'Padding','same')batchNormalizationLayerreluLayermaxPooling2dLayer(2,'Stride',2)convolution2dLayer(3,16,'Padding','same')batchNormalizationLayerreluLayermaxPooling2dLayer(2,'Stride',2)convolution2dLayer(3,32,'Padding','same')batchNormalizationLayerreluLayerfullyConnectedLayer(10)softmaxLayerclassificationLayer];

这其中,各层的参数如下:
convolution2dLayer

参数 含义
FilterSize 3,3 卷积核尺寸
NumFilter 8 卷积核数量
Padding ‘same’ new_height = new_width = W / S (结果向上取整)
(W×W的输入矩阵,F×F的卷积核,步长为S=1)

BatchNormalizationLayer
归一化层采用默认数据

maxPooling2dLayer

参数 含义
PoolSize 2,2 池化尺寸
Stride 2,2 步长

fullyConnectedLayer
全连接层输出为10(0-9共10个数字)

训练神经网络

imds = imageDatastore('train_dataset', ...'IncludeSubfolders',true,'LabelSource','foldernames');
%导入数据[imdsTrain,imdsValidation] = splitEachLabel(imds,0.8,'randomize');
%分割数据集与测试集options = trainingOptions('sgdm', ...'InitialLearnRate',0.01, ...'MaxEpochs',5, ...'Shuffle','every-epoch', ...'ValidationData',imdsValidation, ...'ValidationFrequency',30, ...'Verbose',false, ...'Plots','training-progress');
%设置训练参数net = trainNetwork(imdsTrain,layers,options);
%训练神经网络


这里可以看出来基本上第三个世代就已经训练差不多了,最后的accuracy也能达到99.80%

测试数据集

YPred = classify(net,imdsValidation);
YValidation = imdsValidation.Labels;accuracy = sum(YPred == YValidation)/numel(YValidation);figure;
perm = randperm(10000,20);
for i = 1:20subplot(4,5,i);s = classify(net,imread(imds.Files{perm(i)}));imshow(imds.Files{perm(i)});title(string(s));
end

随机挑出来20个看看效果,没什么大问题:

鼠绘输入识别的GUI

GUI的代码编写不算难,直接回调函数里面编写也比较方便。这里着重讲一下鼠绘的问题,网上查了很多资料也踩了不少坑,这里按处理顺序把比较坑的细节都放一下:

鼠绘区域


红色区域里面只有axes1是有实际作用的,为了美观我把X、Y轴颜色改成了背景的灰色以达到隐藏的效果。此外,还需要把X、Y轴XLimMode、YLimMode设置为manual,其主要作用是锁住它们,不然在鼠绘的时候每一笔都会飘。

此外,对该区域的鼠绘效果显示代码如下:

figure1_WindowButtonDownFcn

unction figure1_WindowButtonDownFcn(hObject, eventdata, handles)
% hObject    handle to figure1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global draw_enable;
global x;
global y;
draw_enable=1;
if draw_enableposition=get(gca,'currentpoint');x(1)=position(1);y(1)=position(3);
end

figure1_WindowButtonMotionFcn

function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
% hObject    handle to figure1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global draw_enable;
global x;
global y;
if draw_enableposition=get(gca,'currentpoint');x(2)=position(1);y(2)=position(3);h1 = line(x,y,'EraseMode','xor','LineWidth',5,'color','black');x(1)=x(2);y(1)=y(2);
end

figure1_WindowButtonUpFcn

function figure1_WindowButtonUpFcn(hObject, eventdata, handles)
% hObject    handle to figure1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global draw_enable
draw_enable=0;

特别特别需要注意的是,这三个回调函数都是在整个GUI默认的整体面板上来的,也就是figure1。具体找到这个回调函数的如下图所示:

没错,就是点击GUI编辑面板空白区域!

识别

识别按钮的回调函数很简单这里就不赘述了,需要特别提醒的是:
从绘制区域直接得到的并不是可直接使用图像数据,这里直接保存到默认目录一份正好也做备份用;
再者,保存好的图像的手写数据部分是深色的,背景部分是浅色的,这与我们之前的训练数据是不符的,直接用来识别肯定不会出现正确的答案,所以把这个数据读取之后再取反色,部分代码如下:

h=getframe(handles.axes1);
imwrite(h.cdata,'output.jpg','jpg');
img = imread('output.jpg');
img = imresize(img,[28,28]);
img = rgb2gray(img);
img = 255 - img; %取反色

结论

“0-9”这十个数字逐一写了一遍感觉问题不大,但是千万别因为鼠绘区域大懒省事儿把数字写的很小这会影响到识别结果,如果实在感觉控制不好,可以在GUI编辑界面把整个界面改成按比例,这样实际使用的时候可以等比例把界面拉小,鼠绘更方便一些。有其他问题可以发邮件给我:garker@foxmail.com(不经常看私信)
训练素材与gui代码在这里分享出来:
链接:https://pan.baidu.com/s/1hZeVx8htEBfXeHlyE8fsOw
提取码:gark

基于MATLAB的神经网络进行手写体数字识别(含鼠绘GUI / 数据集:MNIST)相关推荐

  1. 基于AlexNet卷积神经网络的手写体数字识别系统研究-附Matlab代码

    ⭕⭕ 目 录 ⭕⭕ ✳️ 一.引言 ✳️ 二.手写体数字识别系统 ✳️ 2.1 MNIST 数据集 ✳️ 2.2 CNN ✳️ 2.3 网络训练 ✳️ 三.手写体数字识别结果 ✳️ 四.参考文献 ✳️ ...

  2. matlab+BP神经网络实现手写体数字识别

    个人博客文章链接:http://www.huqj.top/article?id=168 接着上一篇所说的 BP神经网络,现在用它来实现一个手写体数字的识别程序,训练素材来自吴恩达机器学习课程,我把打包 ...

  3. 基于TensorFlow卷积神经网络的手写体数字识别

    一.卷积神经网络(CNN) 二.LeNet 三.代码 1.Mnist手写体训练并测试 2.可视化 四.数据集分析 五.结果分析 1.准确率 2.可视化测试 一.卷积神经网络(CNN) 参考:https ...

  4. 基于AlexNet卷积神经网络的手写体数字倾斜校正系统研究-附Matlab代码

    ⭕⭕ 目 录 ⭕⭕ ✳️ 一.引言 ✳️ 二.AlexNet 网络 ✳️ 三.实验验证 ✳️ 3.1 实验数据集 ✳️ 3.2 数据训练 ✳️ 3.3 手写体倾斜数字校正结果 ✳️ 四.参考文献 ✳️ ...

  5. 并行化实现基于BP神经网络的手写体数字识别

    并行化实现基于BP神经网络的手写体数字识别 手写体数字识别可以堪称是神经网络学习的"Hello World" ,我今天要说的是如何实现BP神经网络算法的并行化,我们仍然是以手写体数 ...

  6. 【电力负荷预测】基于matlab BP神经网络电力负荷预测【含Matlab源码 278期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [电力负荷预测]基于matlab BP神经网络电力负荷预测[含Matlab源码 278期] 获取代码方式2: 付费专栏Matlab智能算 ...

  7. 基于BP神经网络的手写体数字识别matlab仿真实现

    目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础 文字.数字识别是一个典型的模式识别问题,也是模式识别中一个非常重要的应用领域.在文字.数字识别系统中,手写体的文字与识别是一个较难的领域, ...

  8. 基于MNIST手写体数字识别--含可直接使用代码【Python+Tensorflow+CNN+Keras】

    基于MNIST手写体数字识别--[Python+Tensorflow+CNN+Keras] 1.任务 2.数据集分析 2.1 数据集总体分析 2.2 单个图片样本可视化 3. 数据处理 4. 搭建神经 ...

  9. Tensorflow - 加载卷积神经网络实现手写体数字识别

    上一篇博客中,我们已经训练好了模型 https://blog.csdn.net/Polaris47/article/details/80718328 接下来我们要加载模型并识别真实场景下的一个手写体数 ...

最新文章

  1. 用animation的steps属性制作帧动画
  2. UVa 10290 - {Sum+=i++} to Reach N
  3. 7-1 作业调度算法--先来先服务
  4. Function宝典
  5. docker学习笔记-为容器配置重启策略
  6. 《Python Cookbook 3rd》笔记(2.19):实现一个简单的递归下降分析器
  7. pygame的字体画不出来_微软的python3教学的pygame的小游戏解析和学习
  8. Linux alias设置别名 Ubuntu设置别名创建简写指令短命令
  9. Windows Phone 8.1 应用商店将于 12 月 16 日关闭
  10. python在windows上的扩展名_python – 如何克服 – 在windows上使用文件名或扩展名失败的pip install ansible...
  11. 软件测试2019:第七次作业
  12. java设计模式--创建模式--单例模式
  13. java 密码加密_Java如何实现密码加密
  14. PPT文档解析之母版
  15. python 分词字典的词性_NLP注2“自定义词性与词典实现”,笔记,字典,的
  16. CSDN【精品专栏】第28期
  17. 游戏HTML翻翻乐,大班益智游戏翻翻乐教案
  18. #VCS# 关于VCS 编译选项 《-v 、 -y 、+libext+》 的理解
  19. 在火狐上安装chrome 的crx扩展
  20. 遥遥领先一键导出微信小程序、UNIAPP低代码源码使用介绍

热门文章

  1. 什么是Java序列化?
  2. 重塑汽车的最新5G标准
  3. Css打造一个简单的静态七巧板
  4. 丐帮洪七公和郭靖在路上碰到了黄老邪和老毒物
  5. 对计算机网络看法500字,500字信息技术学习评价
  6. 电控测试团队建设回顾
  7. 伪代码基本规范~呦呦呦
  8. Js 方法函数记录笔记
  9. 【实例】Python tkinter 实例 桌面便签
  10. 移动网络运营商显示无服务器,无线路由器忽然拨不上号,显示网络运营商远端无响应怎么处理...