用BP网络算法实现对含噪声0到9数字的识别_第1页
用BP网络算法实现对含噪声0到9数字的识别_第2页
用BP网络算法实现对含噪声0到9数字的识别_第3页
用BP网络算法实现对含噪声0到9数字的识别_第4页
用BP网络算法实现对含噪声0到9数字的识别_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

..用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%时,对于每个节点:一.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.0754051/0.001,Gradient0.0374297/1e-006TRAINGDX,Epoch150/5000,SSE0.0248915/0.001,Gradient0.0143682/1e-006TRAINGDX,Epoch160/5000,SSE0.0108384/0.001,Gradient0.00538902/1e-006TRAINGDX,Epoch170/5000,SSE0.00593896/0.001,Gradient0.00301417/1e-006TRAINGDX,Epoch180/5000,SSE0.00367134/0.001,Gradient0.00179562/1e-006TRAINGDX,Epoch190/5000,SSE0.0023838/0.001,Gradient0.000994086/1e-006TRAINGDX,Epoch200/5000,SSE0.00160969/0.001,Gradient0.000633002/1e-006TRAINGDX,Epoch210/5000,SSE0.00110437/0.001,Gradient0.000424074/1e-006TRAINGDX,Epoch213/5000,SSE0.00098557/0.001,Gradient0.000374607/1e-006TRAINGDX,Performancegoalmet.Ep的收敛曲线为:1.3.含有噪声信号的训练为了保证设计的网络对噪声不敏感,可用理想的数字向量和加了噪声的数字表向量分别训练网络。设置向数字表加入的噪声信号平均值分别为0.1和0.2。这样就可以保证神经元网络学会在辨别带噪声信号的数字表向量时,也能对理想的数字向量有正确的识别。另外,设置网络对含噪声信号的向量进行训练的最大时间为12000个单位时间,并且把误差参数也增加到0.006。之所以要提高误差参数,是因为这次的训练向量〔其中一些向量含有误差增加了四倍。1.4.再次对无噪声信号训练上面已经用含噪声的信号对网络进行了训练,为了保证网络总是能够正确地对理想输入进行分类,我们需要再一次用无噪声的理想信号对网络进行训练。其代码如下: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>;二.系统性能评估为了测试我们设计的网络模式识别系统的可靠性,我们用数百个加入了不同数量的噪声的数字向量作为输入,来观察其输出结果。〔系统性能评估的代码见附页在本问题中,使用不同级别的误差信号,并且绘制理论网络识别率与噪声信号的比较的曲线。如下图所示:加到网络输入向量上的噪声均值为0,标准差范围为0~0.5。在每个噪声级别上,分别有100个不同版本的噪声信号被加到每个数字向量上,然后用设计的网络计算其输出。将输出通过竞争传递函数,保证10个输出〔代表0~9中的数字中只有一个的值为1,其余均为0。上图中靠上的红线显示的是既经过噪声信号又经过非噪声信号训练后的网络的可靠性。而靠下的蓝线显示的则是同样的网络只经过非噪声信号而没有经过噪声信号训练的网络的可靠性。从以上的曲线可以看出,网络经过含噪声信号的输入训练后,其容错能力有了较明显的增强。它们各自在加噪为10%、20%和30%是的识别率用表格表示为:识别率加噪为10%加噪为20%加噪为30%既经过噪声信号又经过非噪声信号训练后的网络77.9%54.6%34.0%只经过非噪声信号而没有经过噪声信号训练的网络73.1%49.0%29.8%当输入向量的误差平均值为0或0.05时,网络识别没有错误。但是当误差平均值达到0.2时,两个网络都开始产生误差。如果需要有更高的精度,一种办法是增长网络的训练时间,另一种办法是增加网络隐含层的神经元数目。当然,把输入的数字向量从5×5的网格增加到6×6的网络也是一种办法。另外,如果网络要求对误差信号有更高的可靠性,还可以在训练时增加输入向量的误差的数量。为了测试系统,可试验几个实际的数字,并对它们加入误差信号,然后把它们输入到网络中,观察其得到的输出,如下图所示:加噪为10%时,识别1、2、3的结果为:加噪为20%时,识别1、2、3的结果为:加噪为30%时,识别1、2、3的结果为:由图可以看出,网络较正确地识别了这些数字。所以本设计是比较成功的。源程序为:%number110X25为系统输入的转置number1=[0010000100001000010000100;%11111100001111111000011111;%21111100001111110000111111;%31010010100111110010000100;%41111110000111110000111111;%51111110000111111000111111;%61111100001000010000100001;%71111110001111111000111111;%81111110001111110000100001;%91111110001100011000111111];%0number=number1';%number为系统输入矢量targets=eye<10>;%targets为目标矢量%下面使用函数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;%下面进行无噪声训练%训练结束条件:最大次数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>;%下面进行含噪声信号的训练netn=net;netn.trainParam.goal=0.006;netn.trainParam.epochs=12000;T=[targetstargetstargetstargets];forpass=1:10E1=rand<25,10>;E2=rand<25,10>;form=1:25forn=1:10if<E1<m,n>*100<10>E1<m,n>=1;elseE1<m,n>=0;end;if<E2<m,n>*100<20>E2<m,n>=1;elseE2<m,n>=0;end;end;end;P=[number,number,...rem<number+E1,2>,...rem<number+E2,2>];[netn,tr]=train<netn,P,T>;end%下面网络再次对无误差输入信号进行训练P=number;T=targets;netn.performFcn='sse';netn.trainParam.goal=0.001;netn.trainParam.show=10;netn.trainParam.epochs=5000;netn.trainParam.mc=0.95;[netn,tr]=train<netn,P,T>;%pause;%下面代码用来测试网络容错性noise_range=0:0.05:0.5;max_test=100;T=targets;fori=1:11noise_level<i>=noise_range<i>;errors1<i>=0;errors2<i>=0;forj=1:max_testE=rand<25,10>;form=1:25forn=1:10if<E<m,n><noise_range<i>>E<m,n>=1;elseE<m,n>=0;end;end;end;P=rem<number+E,2>;%测试未经误差训练的网络A=sim<net,P>;AA=compet<A>;errors1<i>=errors1<i>+sum<sum<abs<AA-T>>>/2;%测试经过误差训练的网络An=sim<netn,P>;AAn=compet<An>;errors2<i>=errors2<i>+sum<sum<abs<AAn-T>>>/2;end;end;%pausecorrect1=1-errors1/1000;correct2=1-errors2/1000;figureplot<noise_range,correct1,'r-',noise_range,correct2>;title<'识别率'>;xlabel<'噪声指标'>;ylabel<'未经误差训练的网络-经过误差训练的网络---'>;%对实际含噪声的数字进行识别err=0.3;forindex=1:1:3E=rand<25,1>;form=1:25if<E<m,1><err>E<m,1>=1;elseE<m,1>=0;end;end;noisyJ=rem<number<:,index>+E,2>;e=index;subplot<2,3,e>;plotchar<noisyJ>;A2=sim<net,noisyJ>;A2=compet<A2>;answer=find<compet<A2>==1>;subplot<2,3,e+3>;plotchar<number<:,answer>>;end;fprintf<'程序运行成功结束!!!'>;附:另外还有一种理解噪声的方式,即认为所加载的噪声是正态分布的,当加噪为10%时,就是将标准正态分布的噪声乘以10%叠加在训练样本上,例如加噪10%的噪声可以为:0.1157-0.0408-0.15640.27960.13980.17240.0627-0.2090-0.0606-0.08630.0344-0.0579-0.04680.0583-0.03260.0585-0.0320-0.1959-0.10360.14710.17700.1310-0.0191-0.0718-0.0347这是的Matlab编程与前面的方法相比较为简单,相对的区别是输入的训练样本为:P=number+randn<25,10>*noise_level<i>;而之上的输入训练样本表示形式为:E=rand<25,10>;form=1:25forn=1:10if<E<m,n><noise_range<i>>E<m,n>=1;elseE<m,n>=0;end;end;end;P=rem<number+E,2>;类似的,使用不同级别的误差信号,并且绘制理论网络识别率与噪声信号的比较的曲线。如下图所示:上图中靠上的红线显示的是既经过噪声信号又经过非噪声信号训练后的网络的可靠性。而靠下的蓝线显示的则是同样的网络只经过非噪声信号而没有经过噪声信号训练的网络的可靠性。各自在加噪为10%、20%和30%是的识别率用表格表示为:识别率加噪为10%加噪为20%加噪为30%既经过噪声信号又经过非噪声信号训练后的网络100%98.7%89.3%只经过非噪声信号而没有经过噪声信号训练的网络100%98.2%89.0%可见,用这种方式理解的噪声的识别率比之前的识别率大大提高了。加噪为10%时,识别1、2、3的结果为:加噪为20%时,识别1、2、3的结果为:加噪为30%时,识别1、2、3的结果为:源程序为:%number110X25为系统输入的转置number1=[0010000100001000010000100;%11111100001111111000011111;%21111100001111110000111111;%31010010100111110010000100;%41111110000111110000111111;%51111110000111111000111111;%61111100001000010000100001;%71111110001111111000111111;%81111110001111110000100001;%91111110001100011000111111];%0number=number1';%number为系统输入矢量targets=eye<10>;%targets为目标矢量%下面使用函数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;%下面进行无噪声训练%训练结束条件:最大次数5000,误差平方和为0.001;P=number;T=targets;net.performFcn='sse';net.trainParam.goal=0.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论