•用BP算法实现数字字符(0-9)识别F0303033班5030309906戴海鹏——《人工智能导论》字符识别是模式识别领域的一项传统的课题,这是因为字符识别不是一个孤立的问题,而是模式识别领域中大多数课题都会遇到的基本问题,并且在不同的课题中,由于具体的条件不同,解决的方法也不尽相同,因而字符识别的研究仍具有理论和实践意义。这里讨论的是用神经网络识别数字的问题.人工神经网络模式识别方法是近些年提出的新方法,为字符识别研究提供了一种新手段,它具有一些传统技术所没有的优点:良好的容错能力、分类能力强、并行处理能力和自学习能力。因而,采用神经网络识别方式是一种很好的选择。神经网络的字符识别系统是神经网络模式识别系统的一种,原理是一致的。一般神经网络字符识别系统由预处理,特征提取和神经网络分类器组成。预处理就是将原始数据中的无用信息删除,平滑,二值化和进行幅度归一化等。神经网络字符识别系统中的特征提取部分不一定存在,这样就分为两大类:(1)有特征提取部分的:这一类系统实际上是传统方法与神经网络方法技术的结合,这种方法可以充分利用人的经验来获取模式特征以及神经网络分类能力来识别字符。特征提取必须能反应整个字符的特征。但它的抗干扰能力不如第2类。(2)无特征提取部分的:省去特征抽取,整个字符直接作为神经网络的输入(有人称此种方式是使用字符网格特征),这种方式下,系统的神经网络结构的复杂度大大增加了,输入模式维数的增加导致了网络规模的庞大。此外,神经网络结构需要完全自己消除模式变形的影响。但是网络的抗干扰性能好,识别率高。构造神经网络分类器首先要选择适当的网络结构:神经网络分类器的输入就是数字字符的特征向量;神经网络分类器的输出节点应该是字符数。10个数字输出层就有个10个神经元,每个神经元代表一个数字;隐层数要选好,每层神经元数要合适,目前有很多采用一层隐层的网络结构。然后要选择适当的学习算法,这样才会有很好的识别效果。在学习阶段应该用大量的样本进行训练学习,通过样本的大量学习对神经网络的各层网络的连接权值进行修正,使其对样本有正确的识别结果,这就像人记数字一样,网络中的神经元就像是人脑细胞,权值的改变就像是人脑细胞的相互作用的改变,神经网络在样本学习中就像人记数字一样,学习样本时的网络权值调整就相当于人记住各个数字的形象,网络权值就是网络记住的内容,网络学习阶段就像人由不认识数字到认识数字反复学习过程是一样的。神经网络是按整个特征向量的整体来记忆数字的,只要大多数特征符合曾学习过的样本就可识别为同一字符,所以当样本存在较大噪声时神经网络分类器仍可正确识别。在字符识别阶段,只要将输入进行预处理,特征提取后的特征向量作为神经网络分类器的输入,经过网络的计算,分类器的输出就是识别结果。这里我们采用BP神经网络来进行车辆字符的识别。BP网络是采用Widrow-Hoff学习算法和非线性可微转移函数的多层网络。一个典型的BP网络采用的是梯度下降算法,也就是Widrow-Hoff算法所规定的。backpropagation就是指的为非线性多层网络计算梯度的方法。一个典型的BP网络结构如图所示:我们将它用向量图表示如下:其中:对于第k个模式对,输出层单元的j的加权输入为,该单元的实际输出为,而隐含层单元i的加权输入为,该单元的实际输出为,函数f为可微分递减函数。其算法描述如下:(1)初始化网络及学习参数,如设置网络初始权矩阵、学习因子等。(2)提供训练模式,训练网络,直到满足学习要求。(3)前向传播过程:对给定训练模式输入,计算网络的输出模式,并与期望模式比较,若有误差,则执行(4);否则,返回(2)。(4)后向传播过程:a.计算同一层单元的误差;b.修正权值和阈值;c.返回(2)我采用Matlab来模拟用神经网络进行车牌照数字识别这一过程。作为对比,一种采用提取特征部分的方法,一组采用无特征部分提取的方法。下面就开始用BP网络的思想来设计实现一个真正的实际的神经网络。BP网络的一个重要的用途就是用于模式识别。我们的任务是要设计并训练出一个可行、高效的BP网络,以实现对0到9共10个加噪声后的数字和识别。这里,数字采用了5×5共25点阵的形式,使用美观的数码管字体。首先,要选择一种编码方式。这里要求的是点阵直接0-1编码的方式。比如,对于数字1,可以编码为:0010000100001000010000100但是,上图只是理想图像系统得到的结果,实际中的图像系统总会存在一些噪声干扰或者是非线性因素。设计的网络要不仅能够对理想的输入向量进行很好的分类,也要对含有误差的输入向量有合理的准确度。在本问题中,10个含25个元素的输入向量被定义成一个输入向量矩阵number。目标向量也被定义成一个变量targets,每个目标向量含有10个元素。向量代表某个数字,则其对应位置的元素值为1,而其他位置的元素值为0。例如,数字0对应的向量,其第一个位置的元素值为1(因为0是数字0~9中的第一个数字),而从第2~10个位置的元素值均为0。设计的网络把25个布尔值作为一个具有25个元素的输入向量。需要网络通过输出一个具有10个元素的输出向量来区分数字。这个10元素向量的每一个代表着一个数字。在正常运行的情况下,对于一个输入数字,网络要能输出一个向量,它的对应位置元素值为1,其他的值为0。除此之外,网络还必须能够有容错能力。在实际中,网络不可能接收到一个理想的布尔向量作为输入。假设设计的网络能够有一定的容错能力,对于输入向量,若其噪声均值为0,标准差不大于0.2,则能够分辨出来。为了辨别数字,所设计的网络需要有25个输入,在输出层,则需要有10个神经元。我们设计一个有两层结构的log-sigmoid/log-sigmoid网络。之所以选择log-sigmoid函数,是因为它的输出范围(0到1)正好适合学习后输出布尔值。在网络的隐含层(第一层)设计了10神经元。关于神经元的数组选择不仅需要经验也还要有猜测的成分。训练网络就是要使其将输出向量中正确的位置设置为1,其余位置全为0。然而,由于噪声信号的引入,网络就可能不会输出正确的1或0信号。在网络被训练后,将带有噪声的数字信号输入网络,就会在正确的位置上得到1和0。当数字数据混入噪声时,可以看作是对0、1数据进行简单的随机反转。比如说,要加入10%的噪声,那就可以对2至3个0或者1进行反转。反转哪一个,这里是随机的。如上图,经噪声干扰后的0编码为:0011000100011000010000000图中,加下划线的斜体部分就是噪声。在编程时实际的做法是将均匀分布的噪声叠加在训练样本上,例如加噪10%时,对于每个节点:则不变变或者变则10011010100)1,0(random一.Matlab编程1.1.使用函数newff创建一个两层网络。S1=10;[R,Q]=size(number);[S2,Q]=size(targets);P=number;net=newff(minmax(P),[S1S2],{'logsig''logsig'},'traingdx');net.LW{2,1}=net.LW{2,1}*0.01;net.b{2}=net.b{2}*0.01;为了使产生的网络对输入向量有一定的容错能力,最好的办法是既使用理想的信号和又使用带有噪声的信号对网络进行训练。我们的具体做法是先用理想的输入信号对网络进行训练,直到平方和误差足够小。接下来,使用10组理想信号和带有噪声的信号对网络进行训练。在输入带有误差的向量时,要输入两倍重复的无误差信号,这样做的目的是为了保证网络在分辨理想输入向量时的稳定性。在网络进行了上述的训练以后,网络对无误差的信号可能也会采用对付带有噪声信号的办法。这样做就会付出较大的代价。因此,我们可以再一次训练网络。这一次就只使用理想的向量进行训练。这样就可以保证在输入端输入理想数字信号时,网络能够最好地对其做出反应。以上所有的训练都是使用BP网络来实现的。网络学习的速率和冲量参数设置为自适应改变。使用函数trainbpx进行快速训练。1.2.无噪声的训练开始时使用无噪声的信号对网络进行训练。当训练时间达到5000个时间单位或者是网络平方和误差小于0.001时停止网络的训练。输入训练样本为:number1=[0010000100001000010000100;%11111100001111111000011111;%21111100001111110000111111;%31010010100111110010000100;%41111110000111110000111111;%51111110000111111000111111;%61111100001000010000100001;%71111110001111111000111111;%81111110001111110000100001;%91111110001100011000111111];%0的转置。输出目标向量为:targets=[1000000000;0100000000;0010000000;0001000000;0000100000;0000010000;0000001000;0000000100;0000000010;0000000001;]训练过程误差变化情况可通过MATLAB进行观察。下面进行无噪声训练,训练结束条件:最大次数5000,误差平方和为0.001;P=number;T=targets;net.performFcn='sse';net.trainParam.goal=0.001;net.trainParam.show=10;net.trainParam.epochs=5000;net.trainParam.mc=0.95;[net,tr]=train(net,P,T);从Matlab程序运行主窗口可以得到一次训练过程的误差变化情况如下:TRAINGDX,Epoch0/5000,SSE24.6758/0.001,Gradient11.1211/1e-006TRAINGDX,Epoch10/5000,SSE14.9317/0.001,Gradient6.45664/1e-006TRAINGDX,Epoch20/5000,SSE10.3002/0.001,Gradient2.71067/1e-006TRAINGDX,Epoch30/5000,SSE8.8988/0.001,Gradient0.935004/1e-006TRAINGDX,Epoch40/5000,SSE8.6348/0.001,Gradient0.647037/1e-006TRAINGDX,Epoch50/5000,SSE8.5208/0.001,Gradient0.71758/1e-006TRAINGDX,Epoch60/5000,SSE8.21807/0.001,Gradient0.779685/1e-006TRAINGDX,Epoch70/5000,SSE7.59446/0.001,Gradient0.723299/1e-006TRAINGDX,Epoch80/5000,SSE6.83991/0.001,Gradient0.867937/1e-006TRAINGDX,Epoch90/5000,SSE5.58366/0.001,Gradient0.653499/1e-006TRAINGDX,Epoch100/5000,SSE4.06306/0.001,Gradient0.56084/1e-006TRAINGDX,Epoch110/5000,SSE2.53431/0.001,Gradient0.38593/1e-006TRAINGDX,Epoch120/5000,SSE1.17375/0.001,Gradient0.295479/1e-006TRAINGDX,Epoch130/5000,SSE0.322258/0.001,Gradient0.114873/1e-006TRAINGDX,Epoch140/5000,SSE0.07