微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 电源设计 > 基于BP网络的字母识别

基于BP网络的字母识别

时间:12-25 来源:互联网 点击:

摘 要: 介绍了用BP神经网络方法对英文字母进行识别,并在识别过程中考虑了噪声干扰及非线性因素的存在,使网络具有一定的容错能力,并用MATLAB完成了对字母识别的模拟。
  关键词: BP神经网络;模式识别,MATLAB

  智能控制作为一门新兴的交叉学科,在许多方面都优于传统控制,而智能控制中的人工神经网络由于模仿人类的神经网络,具有感知识别、学习、联想、记忆、推理等智能,更是有着广阔的发展前景。其中最核心的是反向传播网络(Back Propagation Network),简称BP网络[1]。本文介绍了运用matlab工具箱确定隐层神经元的个数和构造BP神经网络,并用两类不同的数据对该神经网络进行训练,然后运用训练后的网络对字符进行识别。
1 BP网络
1.1 BP网络的简介
  20世纪80年代中期,学者Rumelhart、McClelland和他们的同事提出了多层前馈网络MFNN(Mutltilayer Feedforward Neural Networks)的反向传播学习算法,简称BP网络(Back Propagation Network)学习算法。BP网络是对非线性可微分函数进行权值训练的多层前向网络。在人工神经网络的实际应用中,80%~90%的模型都采用BP网络或其变化形式。
BP网络主要作用于以下几个方面:
  (1)函数逼近:用输入矢量和相应的输出矢量训练一个网络来逼近一个函数;
  (2)模式识别:用一个特定的输出矢量将它与输入矢量联系起来;
  (3)分类:把输入矢量以所定义的合适的方式进行分类;
  (4)数据压缩:减少输出矢量的维数以便于数据传输或存储。
1.2 BP网络模型
  BP网络是一种单向传播的多层前向网络[2],每一层节点的输出只影响下一层节点的输出,其网络结构如图1所示,其中X和U分别为网络输入、输出向量,每个节点表示一个神经元。网络是由输入层、隐层和输出层节点构成,隐层节点可为一层或多层,同层节点没有任何耦合,前层节点到后层节点通过权连接。输入信号从输入层节点依次传过各隐层节点到达输出层节点。

2字符识别问题的描述及网络识别前的预处理
  字符识别是模式识别领域的一项传统课题,这是因为字符识别不是一个孤立的问题,而是模式识别领域中大多数课题都会遇到的基本问题,并且在不同的课题中,由于具体的条件不同,解决的方法也不尽相同,因而字符识别的研究仍具有理论和实践意义。这里讨论的是用BP神经网络对26个英文字母的识别。
  在对字母进行识别之前,首先必须将字母进行预处理[3],即将待识别的26个字母中的每一个字母都通过的方格形式进行数字化处理,其有数据的位置设为1,其他位置设为0。如图2给出了字母A、B和C的数字化过程,然后用一个1×35的向量表示。例如图2中字母A的数字化处理结果所得对应的向量为:
  LetterA=[00100010100101010001111111000110001]

  由此可得每个字母由35个元素组成一个向量。由26个标准字母组成的输入向量被定义为一个输入向量矩阵alphabet,即神经网络的样本输入为一个35×26的矩阵。其中alphabet=[letterA,letterB,lettereC,……letterZ]。网络样本输出需要一个对26个输入字母进行区分输出向量,对于任意一个输入字母,网络输出在字母对应的顺序位置上的值为1,其余为0,即网络输出矩阵为对角线上为1的26×26的单位阵,定义为target=eye(26)。
  本文共有两类这样的数据作为输入:一类是理想的标准输入信号;另一类是在标准输入信号中加上用MATLAB工具箱里的噪声信号,即randn函数。
3 网络设计及其试验分析
  为了对字母进行识别,所设计的网络具有35个输入节点和26个输出节点,对于隐含层节点的个数的选取在后面有详细的介绍。目标误差为0.000 1,从输入层到隐层的激活函数采用了S型正切函数tansig,从隐层到输出层的激活函数采用了S型对数函数logsig,这是因为函数的输出位于区间[0,1]中,正好满足网络输出的要求。
3.1 隐层节点个数的确定
  根据BP网络的设计目标,一般的预测问题都可以通过单隐层的BP网络实现。难点是隐层节点个数的选择,隐层节点数对网络的学习和计算特性具有非常重要的影响,是该网络结构成败的关键。若隐层节点数过少,则网络难以处理复杂的问题;但若隐层节点数过多,则将使网络学习时间急剧增加,而且还可能导致网络学习过度,抗干扰能力下降。
  目前为止,还没有完善的理论来指导隐层节点数的选择,仅能根据Kolmogorov定理,和单隐层的设计经验公式[4],并考虑本例的实际情况,确定隐层节点个数应该介于8~17之间。
  本文设计了一个隐层节点数目可变的BP网络,通过误差对比,确定最佳的隐层节点个数,具体程序如下:
  [alphabet,targets]=prprob;
  p=alphabet;
  t=targets;
  s=8:17;
  res=zeros(1,10);
  res2=zeros(1,10);
  for i=1:10
  fprintf('s(i)=%.0fn',s(i));
  net=newff(minmax(p),[s(i),26],{'tansig','logsig'},'traingdx');
  net.trainParam.epochs=1000;
  net.trainParam.goal=0.0001;
  [net,tr]=train(net,p,t);
  y=sim(net,p);
  error=(y(1,:)-t(1,:)).^2;
  error2=(y(2,:)-t(2,:)).^2;
  res(i)=norm(error);
  res2(i)=norm(error2);
  pause
  i=i+1;
  end
  通过网络的输出显示以及网络训练速度和精度因素,选取隐层节点的最佳个数为14。
3.2 生成网络
  使用函数newff创建一个两层网络,具体函数为:
  [alphabet,targets]=prprob;
  [R1,Q1]=size(alphabet)
  [R2,Q2]=size(targets)
  S1=14;
  S2=R2;
  net=newff(minmax(p),[S1 S2],{'tansig','logsig'},'trainlm')
  net.LW{2,1}=net.LW{2,1}*0.01;
  net.b{2}=net.b{2}*0.01;
3.3 网络训练
  为了使产生的网络对输入向量有一定的容错能力,最好的办法是使用理想的信号和带有噪声的信号对网络进行训练。使用不同信号的训练都是通过BP网络来实现的。网络学习的速率和冲量参数设置为自适应改变,并使用函数trainlm进行快速训练。
3.3.1 理想样本训练
  首先用理想的输入信号对网络进行训练,直到平方和误差足够小。下面进行理想样本训练,训练结束条件为:最大次数为1 000,误差平方和为0.000 01。训练代码如下:
  net.performFcn='sse';
  net.trainParam.goal=0.00001;
  net.trainParam.show=5;
  net.trainParam.epochs=1000;
  net.trainParam.mc=0.95;
  [net,tr]=train(net,p,t);
  训练过程误差变化情况可通过MATLAB进行观察,训练结果为:
  TRAINLM, Epoch 77/1000, SSE 6.58108e-006/1e-005, Gradient 8.03024e-005/1e-010
  TRAINLM, Performance goal met.
  可见,经过77次训练后,网络误差达到要求,结果如图3所示。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top