基于MATLAB的数字识别
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机与信息工程学院
本科生毕业论文
基于BP神经网络的手写数字识别算法的设计与实现
班级: 13汉班
学号: ***********
*名:***
指导教师:***
2017 年 3 月 31 日
毕业论文目录
1 绪论 (1)
1.1 图像识别的提出 (1)
1.2 图像识别的现状与发展趋势 (1)
2 BP神经网络的概述 (2)
3 手写体数字识别的实现过程 (4)
3.1 整体线路图 (4)
3.2 算法流程 (5)
3.3 图像预处理 (10)
3.4 结果分析 (10)
4 结论 (11)
参考文献 (12)
全文共13 页4834 字
基于BP神经网络的手写数字识别算法的设计与实现计算机与信息工程学院 2013级汉班江晓雪 20131102507
指导教师李艳玲副教授
摘要本文实现了基于MATLAB关于神经网络的手写数字识别算法的设计过程,采用神经网络中反向传播神经网络(即BP神经网络)对手写数字的识别,由MATLAB对图片进行读入、灰度化以及二值化等处理,通过神经网络进行训练和测试。
实验证明:该神经网络对手写数字的识别可以达到95.65%。
关键词手写数字识别;BP神经网络;MATLAB语言
1 绪论
1.1 图像识别的提出
图像识别在信息技术发达的今天已经占据了很重要的地位,在我们实际生活中也有很多应用。
所谓的图像识别,就是指通过计算机对图像进行相应的处理、分析,来达到识别不同模型的目标和任务的一种技术。
对于它的提出,简单的来说,它的发展经历了三个阶段:第一个是文字识别、第二个是数字图像处理与识别、第三个是物体识别。
第一种相对来说比较简单,它的研究是从1950年开始的,一般情况是识别字母、符号和数字,无论是印刷体识别还是手写体识别,它的应用都非常广泛,但是也伴随着,这个识别的过程会更加的耗时、费力,无论是人力还是物力,都会有很大的损失;第二种就是我们所说的数字图像处理与识别,在图片的识别过程中,图片识别会有一定的误差,也会带来小小的麻烦;第三就是物体识别,而物体的识别主要指的是:在三维世界中,对于个体、环境的感知和认识进行识别,这不同于二维世界的认知,相对来说是更高级的计算机图像识别,它是以二维世界中对数字图像和模拟图像处理的办法为依据,进行更高一级的,并且结合了现代人工智能技术等学科的研究目标,研究成果已经被广泛的应用在各种工业探测机器人上,为人们的安全提供了很大的帮助。
1.2 图像识别的现状与发展趋势
随着网络的发达、电子的信息化,图像识别的应用已经非常广泛,而主要的
研究工作也包括各行各业,整理以下几点对其应用的广泛度进行说明:
⒈在生物学中,对生物的原型进行研究。
从生物的脑细胞结构、物体解剖等其他科学研究的方向对生物的体系结构、神经结构、神经细胞组织等生物的原型结构及其功能机理进行研究,增强对生物学更加全面的理解。
⒉在实际应用中,建立我们需要的理论模型。
根据需要应用的信息在生物学中的应用,建立需要的生物原型,也可以建立类似神经元、神经网络这样不可见的理论模型,以便可以让其更加有效的应用在生活中。
建立我们生活中不能直观表现的事物模型,以便我们可以更方便的、更直观的理解事物的本质。
⒊在信息时代中,建立网络模型以及算法研究。
就是通过上面所说的,建立相应的理论模型,在这个基础上加以理解,建立我们所需要的网络模型,实现计算机应用,主要应用在网络学习算法的研究,这方面的研究工作也被人们称为技术模型研究。
⒋信息时代的发展,让我们在生活中有很多的应用,例如:完成某种函数图像的绘制以及对其变化的形式进行分析、对图片信号的处理、模式识别等功能,建立需要的应用系统、制造机器人等等。
通过上面的说明,也就是说从开始根据生物学原理的应用,直到建立需要的神经网络模型,最后应用到图像识别当中,可以看出其模型的建立是在生活中实例的基础上,其可靠性和准确性是显而易见的,这样就大大的增加了可信度,与此同时,也减少了工作中不必要的麻烦与困扰。
而在网络信息发达的今天,人类在基本粒子、宇宙空间、生命起源等科学领域方面都已经显现出很高的兴趣度,而这其中难免会有图像提取后的处理工作,所以图像识别的应用就会越来越广泛。
2 BP神经网络的概述
反向传播(Back-Propagation,BP)学习算法简称BP算法,采用BP算法的前馈型神经网络简称BP网络。
BP网络是多层感知器的一种,它具备多层感知器的特点,同时也有自己的特点。
多层感知器包括输入层、隐藏层、输出层,其中隐藏层可以有多个,而我们BP网络中隐藏层只有一个,其简单构造如图所示:
图1 多层感知器结构图
而我们用到的BP 网络中的具体信号流如图所示,它有一个反向传播的过程,这也是对传播进行调整,使精确度更高的一种办法。
如图所示,其中有两种信号流通:
图2 多层感知器的信号流
第一:函数信号
简单来说就是信号进入输入层,然后通过隐藏层到达输入层,通过输出层输出所得值,就可以完成一个函数信号。
第二:误差信号
误差信号就是在逆向的传播的过程中传输的信号。
其中,有两个重要参数。
一个是函数信号即sigmoid 函数,还有一个就是权值的梯度运算即梯度向量。
(注:sigmoid 函数、权重的修正函数,如图所示。
)
e z z g z sigmoid -+==11
)()( (1)
)()()()(1)(l ij l ij l ij l ij m
m D J ∆+∆==∂∂
λθθ (2) 通过对两个参数的调整,完成整个算法的应用。
3 手写体数字识别的实现过程
3.1 整体线路图
整体流程图如图3所示:
部分文件调用流程图如图4所示:
图3 整体流程图
图4 整体流程图
3.2 算法流程
图片识别要经过训练好的模型来提取我们要得到的手写数字,而模型是经过多次的训练得到的,为了提高程序的准确度、增加可信度的一种数据集,所以,程序的开始,我们设计了多个可用的数据,来训练我们的神经网络。
如图3所示,一开始可视化我们的手写体测试数据,每个数字都保存在20*20的像素里,其中设置25个隐藏单位,0到9共10个数字标签。
将我们需要的参数保存到需要的函数中,也就是我们用到的θ1和θ2中。
也就是保存在我们用的.mat文件中的数据,如图5所示。
图5 手写体训练数据
图6 数据保存文件
注:其中,.mat文件中保存的是二位数组,用来保存我们测试需要的数据。
其次,使用前馈神经网络,当参数λ=0时,运行nnCostFunction.m文件,而文件再调用sigmoidGradient.m、sigmoid.m两个参数文件(其中,sigmoid- GradiEnt.m文件,就是对sigmoid函数的求导,为得就是得到sigmoid函数的梯度值,以便更好的了解数值变化的程度。
而sigmoid.m文件中保存的就是sigmoid函数)。
运行结果是损失函数J=0.287629。
其中也会实现损失函数的正规化和梯度。
而为了检测它的正确性,又使λ=1进行测试,调式,看结果是否符合要求,来检测正确性,得到的结果如图8所示,也是通过两组数据的对比,让我们更加清晰的体会它的不同之处。
图7 实验数据对比图
∑∑==----=m i K k k i i k k i i k x h y x h y m J 11
)()()()()]))((1log()1()))(log(([1)(θθθ (3)
]
)()([2)]))((1log()1()))(log(([1)(1012512)2(,25140012)1(
,11
)()()()(∑∑∑∑∑∑======++----=j k k j j k k j m i K k k i i k k i i k m x h y x h y m J θθλ
θθθ (4)
第三,sigmoid 函数的运行。
运行文件ex4.m 文件中,提到函数g = sig- moidGradient (),是指调用sigmoidGradient.m 文件,文件中写了sigmoid 函数的梯度表达式,而其中的g(z)函数,是sigmoid 函数的方程式, ))(1)(()()(z g z g z g dz
d z g -==' (5)
e z z g z sigmoid -+==11
)()( (6)
通过对文件的调用,输入测试值1、-0.5、0、0.5、1,可以得到输出的梯度数,而当z=0时,可以得到导数值为0.25。
越接近于0,它的变化越明显。
sigmoid 函数梯度指的是标量场中变化的方向,而梯度值的大小就是用来表示变化的大小,简单来说就是我们数学中的斜率,而这么说也只是为了让人们更好的接受。
对于sigmoid 函数的测试,我们用一组数据对它进行测试,得到的结果如图 8所示:
图8 梯度函数测试值
初始化参数(权重W文件的调用说明),文件中使用randInitializeWei- ghts.m文件,来初始化θ1,θ2,产生随机变量,为下边的调用起到很重要的作用。
上文BP神经网络中也曾提到过,权重值是整个过程中很重要的一个参数。
而我们的randInitializeWeights.m文件中,也对其进行了新的定义,给定一个较小的ε值,计算出新的W值。
这个文件的作用是为了让我们打破对称而训练神经网络。
其中初始化W的一部分代码如图所示:
图9 初始化权重值
其中,L_out,L_in是ex4.m文件中传输的数据。
最后,就是这个程序最重要的部分,神经网络的应用。
而神经网络的形成与训练又被分为以下几个部分来实现:初始化神经网络、实现反向传播、实现正则化、训练NN。
而具体的函数调用部分可以从图3代码调用流程图看见,初始化神经网络用randInitializeWeights.m文件进行数据初始化。
而我们的显示界面并没有显示初始化以后的数据,这部分是不可见的。
通过文件调用图可见,实现反向传播和正规化都是运用了同一个文件,也就是说,内部调用的文件也是相同的,只是λ值不同,实现反向传播时λ=0,写在函数内部,进行数据判断,正则化则定义好了λ值,即λ=3,可以看到,因为λ值得不同,运行结果的输出情况也有所不同。
在checkNNGradients.m文件中,还引用了三个.m文件。
运行后得到两列相似的数列,如图10所示。
图10 检查神经网络
这就是用于检测神经网络正确性的测试数据,通过测试数据得到相对偏差,即数字输出是产生的偏差值。
这个数值小于1e-9,则可以使用于数字识别的过程中,得到的结果如图11所示,可以看出,相对偏差小于要求值,则可以进行接下来的运行。
图11相对偏差
文件中通过对nnCostFunction.m文件的调用,可得到相应的测试数据,如图12所示:
图12 成本函数的调试参数
训练神经网络,给出训练循环次数,本次循环次数为50,调用fmincg.m文件。
得到下列一组训练次数为50的数字,得到如图13所示。
图13 神经网络的训练
通过这整个的实验,我们就可以得到自己想要的数据训练集。
3.3 图像预处理
我们都知道,手写体的图片底色可以有很多种,而我们要做的就是将图片处理成我们需要的大小样子,放到训练集里运行,以便得到我们需要的图片信息。
这整个过程又会被分为很多小的地方。
过程可以大致分为以下几个步骤:
引入图片灰度处理索引处理二值化其中,所需要的程序代码部分为:
1、引入图片:imread函数,可以引用多种类型的图片。
不会因为图片的格式不同而影响程序的运行。
2、用matlab中使用rgb2gray函数将彩色图片转化为灰度图像。
3、Graythresh函数是将图片阈值法,将灰度图片转化为索引图。
4、im2bw函数将索引图片二值化
5、用边缘切割算法,对图片进行切割细化。
最后得到的图片矩阵就是我们用到的样式,如果整个过程你还想区别不同样式的图片有什么变化,还可以用图片显示函数imshow进行显示,可以更加详细、明确地观察图片的变化。
3.4 结果分析
结果由图片引入到程序中,经过神经网络的训练识别,成为数字显示在MATLAB的command Window工作区中。
显示准确度以及数字结果。
如图所示:
图14 准确度显示
4 结论
在信息发达的今天,图像识别已经占据了我们生活中很重要的一部分,其中包括遥感应用,矿物的勘探,农业的普查,监测火灾,交通智能化,视频检测跟踪等等。
而我这次的实验,只是其中的冰山一角,或许对这方面不会有太大的影响,但是对我自己的影响是很明显的,图形识别的学习让我自己受益匪浅。
这整个实验下来,既锻炼了我的耐力和意志力,又增强了自己迅速提取信息的能力,整个学习的过程,既枯燥又乏味,就提高了自己的修养,虽然过程很艰辛,但结果总归是好的。
其实,当开始写论文的时候,我还在不断的调试着自己的程序代码,对自己的程序进行更改修正,让它可以更完美的出现在人们的视野里面,达到自己满意的效果。
而我通过这次图像识别的学习也增强了自己的知识领域、扩充了自己的知识储备。
在整个代码的撰写过程中,需要查阅大量和实验相关的资料,这样也就会涉及到各种各样的知识,虽然学到了各种知识,但同时也增加了自己的工作量,因为面对同一类书籍,就会有很多不同的版本以及名称,需要一本本的查阅、检验,找到自己需要的信息,而这整个过程枯燥、乏味,这就锻炼了自己的耐力和信息提取的能力,让自己如何在众多的信息里面提取自己需要的信息,可以更加高速有效的完成任务。
对于MATLAB这个软件,之前一点都没有接触过,所以学习起来就会遇到各种想象不到的问题,而这些困难会让你整体的思路停滞不前,让你整个人都会很暴躁,明明就在眼前,却找不到的感觉就是那么让人抓狂,这时候,你觉得调整好自己的情绪、整理好自己的思路,然后重新出发,在一步一步的捋顺自己的思路想法。
这个过程中,我们要不断的让自己变得更有耐心。
这次实验中积累的知识和方法,是我一生的收获和财富,相信我会终生受益。
在本文的写作过程中得到了李艳玲老师的精心指导,在此表示衷心的感谢。
参考文献
[1] 魏晗陈刚主编.MATLAB数字信号与图像处理范例实战速查宝典.北京:清华大学出版社.
[2] 焦里程主编.神经网络系统理论.西安:西安电子科技大学出版社.
[3] Stormy Attaway主编.MATLAB编程与工程应用(第二版).北京:电子工业出版社.
[4] 史忠植主编.神经网络.北京:高等教育出版社.
[5] https:///view/94d586d133d4b14e85246865.html 2011年8月
Design and Implementation of Handwritten Numeral
Recognition Based on BP Neural Network
Computer and Information Engineering College 2013 JiangXiaoxue 20131102507
Directed by Li Yanling Associate professor
Abstract This paper realizes BP(back propagation)neural network for han- dwritten digit recognition by Matlab. The whole process includes reading, grayscale and binarization processing for the image, and then putting it into the neural network to train and test. Experimental results show that it can reach 95.65% in accuracy.
Keywords Handwritten numeral recognition ;The BP neural network;MATLAB language。