BP算法的具体实现_第1页
BP算法的具体实现_第2页
BP算法的具体实现_第3页
BP算法的具体实现_第4页
BP算法的具体实现_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

BP算法的具体实现实验目的和多层前向网络工作原理实验目的:通过实验了解多层前向网络的工作原理;通过实验掌握多层前向网络用于字符识别的基本原理与方法;通过上机实验掌握BP算法的具体实现和神经网络工具箱中相关函数的使用。多层前向网络工作原理:网络结构单隐层前向网络多层前向网络的一般层(第层结构())激活函数隐层:1.Sigmoid激活函数2.对称的Sigmoid激活函数。输出层:分类问题时,选取Sigmoid或对称Sigmoid作为激活函数;函数逼近问题时,输出层神经元选取线性激活函数。BP算法(1)初始化:选择很小的随机数初始化权值和阈值,如。(2)前向计算(第k步),,,其中.(3)后向计算(第k步)对于(4)更新权值和阈值,动量BP算法最速下降法的锯齿现象是导致BP算法收敛速度慢的主要原因。为了克服这种震荡现象,加快收敛速度,一个经典的解决办法是:使用低通滤波器来平滑震荡。低通滤波器(IIR)考虑下面的一阶滤波器,其中,是滤波器的输入,是滤波器的输出,是动量常数,满足.对上式两边同时进行离散时间Fourier变换,有,。显然,有,(当动量常数接近1时)。因此,上述滤波器是一个低通滤波器。动量BP算法其中实际使用1)权值和阈值的初始化选择很小的随机数:如取中均匀分布的随机数,目的是避免网络的节点饱和,从而大大减少网络所需的训练次数。2)隐层神经元个数的选择网络隐层神经元个数太少,通常导致欠拟合,而网络隐层神经元个数太多,通常导致过拟合,使网络缺乏泛化能力3)训练的停止准则(1)给定迭代次数;(2)停止:,其中为第次迭代后对应所有训练样本的均方误差;(3)交叉确定法(Cross-Validation法)图中绘出了分别对应于training集、validation集和test集的误差下降曲线。使用交叉确认法的停止规则是:当训练集的误差曲线下降曲线与确认的误差曲线下降曲线相背离时,则停止训练。从图中的test集的误差下降曲线可以看出,这种停止准则的有效性。问题描述字符识别是模式识别的一个重要的研究方向,在很多领域有着广泛的应用。本试验考虑设计一个多层前向网络用于二十六个英文字母的识别。在计算机中,字符或图像均可用位图形式描述。图1给出了字母A的位图形式,如果用1表示,其余元素用0表示,则字母A可以用一个如下的矩阵表示图1字母A的位图图2含噪字母A的位图.如果将上述矩阵按行拉直,则得到字母A的理想特征向量表示,即.用同样的方式,可以定义其它所有26个英文字母的理想特征向量,以作为多层前向网络的输入向量。26个英文字母每个字母对应的神经网络的目标输出,用一个26维的向量表示,例如,字母A、B的目标输出分别为其它字母依次类推。26个英文字母的理想特征向量及其所对应的目标输出,可通过调用”prprob”函数得到,位图可使用”plotchar”画出。利用多层前向网络进行字符识别,就是通过设计和训练一个网络,使网络能够对应于字符的特征向量输入得到相应的目标输出。然而,在实际识别过程中,待识别字符的特征向量通常是所对应的理想特征向量的含噪版本,图2给出了一个含有高斯白噪声的字母A的位图。因此,在训练和设计网络时,应该使网络具有一定的抑制噪声的能力。实验内容神经网络工具箱中的函数介绍newff:生成一个新的多层前向网络;traingdx:具有自适应学习率的动量BP学习算法;train:对网络进行训练;sim:对网络进行仿真,即求网络对给定输入所对应的输出。训练网络选取隐层神经元的个数为10,采用每个字母理想特征向量的20个加噪的版本(均值为0,标准方差为0.1和0.2的高斯白噪各10个)作为训练样本,选取适当的初始权值、初始阈值和动量值对网络进行训练,直到网络收敛(停止准则:设定迭代次数或实际输出与期望输出的均方误差值小于一个给定的值,例如,迭代次数为1000;均方误差为0.1)。本次训练网络的迭代次数为3000,均方误差为0.001(程序见bp.m)。检验网络识别能力产生一系列加噪的特征向量(噪声为均值为0高斯白噪)作为网络的输入向量,检验在噪声方差依次为0:0.05:0.5下的正确识别率,绘出识别率与噪声方差的变化关系曲线如下,当噪声方差增大时,识别率下降。‘--’表示训练样本未加噪,‘*’表示加噪,可以看出,加噪训练样本得到的识别率要高于不加噪样本的识别率。(bp1.m)选取不同初始权值和初始阈值对网络进行训练选取[-0.1,0.1],[-0.5,0.5]为两组初始权值和阈值范围,利用MATLAB绘出训练误差收敛曲线如下。[-0.5,0.5][-0.1,0.1]由曲线可以看出,初始阈值和权值在[-0.5,0.5]区间时迭代次数小于[-0.1,0.1],且两条曲线均成阶梯状下降。(bp2.m)使用交叉确认发确定最优隐层神经元的个数用于交叉确认的隐层神经元的个数为:5,10,15,20,30,40;总样本样本:每个字母理想特征向量的80个加噪的版本(均值为0,标准方差为0.1和0.2的高斯白噪各40个)。其中,50%为训练样本,25%为验证样本,25%为检测样本。5个隐层神经元10个隐层神经元15个隐层神经元20个隐层神经元30个隐层神经元40个隐层神经元由上可知,最优隐层神经元个数为40个。对于该网络,计算噪声方差依次为0:0.05:0.5下的正确恢复率如下。易得,当噪声方差增大时,识别率成下降趋势,但仍高于66%。(bp3.m)增加含噪训练样本选取含噪训练样本数量为50、100、200、500、1000且分别选择方差0、0.1、0.2、0.5的高斯含噪训练样本分别训练网络(隐层神经元个数为30),并对应随机产生200个检验数据。方差训练样本数00.10.20.5501.00000.99000.94000.65001001.00000.98000.95500.66002001.00000.99500.94500.69505001.00000.93500.80500.805010001.00000.99500.97000.7600由表可得,当训练样本数一定时,增大方差,会使得识别率下降。但当方差一定,增加训练样本个数时,识别率会出现波动,并不是训练样本个数越多,识别效果越好。(bp4.m)增加隐层神经元个数方差神经元个数00.10.20.5301.00000.99000.96000.8000401.00000.99500.95500.7450501.00001.00000.94500.79501001.00001.00000.93500.76001501.00000.99000.96500.7500从上表可以看出,当隐层神经元一定时,增大方差,会使得识别率下降。但当方差一定,增加神经元个数时,识别率会出现波动,并不是神经元个数越多,识别效果越好。(bp5.m)实验主要结论及改进意见主要结论:设计一个输入层和输出层神经元个数为35、26的单隐层神经网络,选取隐层神经元个数为10,并给定初始权值和阈值为[-0.1,0.1],同时设置迭代次数为3000,均方误差为0.0001。当检验样本的噪声方差增大时,识别率下降。初始阈值和权值在[-0.5,0.5]区间时迭代次数小于[-0.1,0.1],且两条曲线均成阶梯状下降。使用交叉确认法确定了隐层神经元的数量最优为40,并给出了噪声方差依次为0:0.05:0.5下的识别率。改进意见:通过实验知,不能盲目通过增加含噪训练样本个数和隐层神经元个数来提高网络识别能力,个人认为,需要通过进一步的学习来确定。五.程序附录bp.mclc;clear;%Çå³ý¹¤×÷ÇøÖеıäÁ¿[alphabet,targets]=prprob;%ͨ¹ýprprobº¯ÊýµÃµ½ÑµÁ·×Öĸ¼¯ºÍÄ¿±ê¼¯[R,Q]=size(alphabet);[S2,Q]=size(targets);S1=10;%Òþº¬²ã¸öÊýnet=newff(minmax(alphabet),[S1S2],{'logsig''logsig'},'traingdx');%´´½¨Éñ¾­ÍøÂ磬Á½²ã£¬º¯ÊýΪLogsig¡£net.IW{1}=0.2*rand(10,35)-0.1;%ãÐÖµºÍȨֵÔÚ[-0.1,0.1]Ö®¼änet.LW{2}=0.2*rand(26,10)-0.1;net.b{1}=0.2*rand(10,1)-0.1;net.b{2}=0.2*rand(26,1)-0.1;T=alphabet;%ѵÁ·¼¯G=targets;%Ä¿±ê¼¯net.trainParam.goal=0.001;%ѵÁ·¾«¶ÈÄ¿±êΪ0.001net.trainParam.epochs=3000;%µü´ú3000´ÎG1=repmat(targets,1,20);%À©Õ¹Ä¿±ê¼¯T1=[];forj=1:10T1=[T1alphabet+randn(R,Q)*0.1,alphabet+randn(R,Q)*0.2];end[net,tr]=train(net,T1,G1);%ѵÁ·ÓÐÔëÉùµÄÉñ¾­ÍøÂçbp1.mclc;clear;%Çå³ý¹¤×÷ÇøÖеıäÁ¿[alphabet,targets]=prprob;%ͨ¹ýprprobº¯ÊýµÃµ½ÑµÁ·×Öĸ¼¯ºÍÄ¿±ê¼¯[R,Q]=size(alphabet);%È¡µÃ×Öĸ¼¯µÄάÊý[S2,Q]=size(targets);%È¡µÃÄ¿±ê¼¯µÄάÊý£¬ÔÚÕâÀïÄ¿±ê¼¯ÊÇ26¸ö¶þ½øÖÆÊý¡£·Ö±ð´ú±íA~ZS1=10;%Òþº¬²ã¸öÊýnet=newff(minmax(alphabet),[S1S2],{'logsig''logsig'},'traingdx');%´´½¨Éñ¾­ÍøÂ磬Á½²ã£¬º¯ÊýΪLogsig¡£net.IW{1}=0.2*rand(10,35)-0.1;net.LW{2}=0.2*rand(26,10)-0.1;net.b{1}=0.2*rand(10,1)-0.1;net.b{2}=0.2*rand(26,1)-0.1;net.trainParam.goal=0.001;%ѵÁ·¾«¶ÈÄ¿±êΪ0.001net.trainParam.epochs=3000;%µü´ú3000´ÎP=alphabet;%ѵÁ·¼¯T=targets;%Ä¿±ê¼¯[net,~]=train(net,P,T);%ѵÁ·ÍøÂçnetn=net;%´´½¨´øÓÐÔëÉùµÄÍøÂçnetn.trainParam.goal=0.001;%ѵÁ·¾«¶ÈÄ¿±êΪ0.001netn.trainParam.epochs=3000;%µü´ú3000´ÎG1=repmat(targets,1,20);%À©Õ¹Ä¿±ê¼¯T1=[];forj=1:10T1=[T1alphabet+randn(R,Q)*0.1,alphabet+randn(R,Q)*0.2];end[netn,tr]=train(netn,T1,G1);%ѵÁ·ÓÐÔëÉùµÄÉñ¾­ÍøÂçnoise_fanwei=0:0.05:0.5;max_test=100;network1=[];network2=[];fornoiselevel=0:0.05:0.5errors1=0;errors2=0;fori=1:max_testP=alphabet+randn(35,26)*noiselevel;%·ÂÕ漯¼ÓÈëÔëÉùA=sim(net,P);%¶ÔÓÃÎÞÔëÉùѵÁ·µÄÍøÂç½øÐзÂÕæAA=compet(A);%Êä³öΪ1µÄÄǸö¶ÔÓ¦ÊäÈëÏòÁ¿Îª¾ºÕù»ñʤµÄÊäÈëÏòÁ¿errors1=errors1+sum(sum(abs(AA-T)))/2;%¼ÆËãÎó²îAn=sim(netn,P);%¶ÔÓÃÓÐÔëÉùѵÁ·µÄÍøÂç½øÐзÂÕæAAn=compet(An);%Êä³öΪ1µÄÄǸö¶ÔÓ¦ÊäÈëÏòÁ¿Îª¾ºÕù»ñʤµÄÊäÈëÏòÁ¿errors2=errors2+sum(sum(abs(AAn-T)))/2;%¼ÆËãÎó²îendnetwork1=[network1(26*100-errors1)/26/100];%¼ÆËã³öNetwork1µÄÎó²înetwork2=[network2(26*100-errors2)/26/100];%¼ÆËã³öNetwork2µÄÎó²îendplot(noise_fanwei,network1*100,'--',noise_fanwei,network2*100,'*');title('Õýȷʶ±ðÂÊ');xlabel('ÔëÉù·½²î');ylabel('Network1--Network2*');bp2.mclc;clear;%Çå³ý¹¤×÷ÇøÖеıäÁ¿[alphabet,targets]=prprob;%ͨ¹ýprprobº¯ÊýµÃµ½ÑµÁ·×Öĸ¼¯ºÍÄ¿±ê¼¯[R,Q]=size(alphabet);%È¡µÃ×Öĸ¼¯µÄάÊý[S2,Q]=size(targets);%È¡µÃÄ¿±ê¼¯µÄάÊý£¬ÔÚÕâÀïÄ¿±ê¼¯ÊÇ26¸ö¶þ½øÖÆÊý¡£·Ö±ð´ú±íA~ZS1=10;%Òþº¬²ã¸öÊýnet=newff(minmax(alphabet),[S1S2],{'logsig''logsig'},'traingdx');%´´½¨Éñ¾­ÍøÂ磬Á½²ã£¬º¯ÊýΪLogsig¡£net.IW{1}=1.0*rand(10,35)-0.5;net.LW{2}=1.0*rand(26,10)-0.5;net.b{1}=1.0*rand(10,1)-0.5;net.b{2}=1.0*rand(26,1)-0.5;P=alphabet;%ѵÁ·¼¯T=targets;%Ä¿±ê¼¯net.trainParam.goal=0.001;%ѵÁ·¾«¶ÈÄ¿±êΪ0.001net.trainParam.epochs=3000;%µü´ú3000´Î[net,tr]=train(net,P,T);%ѵÁ·´úÓÐÔëÉùµÄÉñ¾­ÍøÂçbp3.mclc;clear;N=80;%²úÉúѵÁ·Ñù±¾ºÍÄ¿±êÊä³ö[p,t]=prprob();[m,n]=size(p);p_new=repmat(p,1,N);%²úÉúº¬ÔëµÄѵÁ·Ñù±¾t_new=repmat(t,1,N);noise=zeros(35,N*26);noise(:,1:n*N/2)=sqrt(0.1)*randn([m,n*N/2]);%¸ß˹°×Ôë¾ùֵΪ0£¬·½²îΪ0.1µÄѵÁ·Ñù±¾noise(:,n*N/2+1:end)=sqrt(0.2)*randn([m,n*N/2]);%¸ß˹°×Ôë¾ùֵΪ0£¬·½²îΪ0.2µÄѵÁ·Ñù±¾p_new=p_new+noise;[trainex,validate,testex]=dividevec(p_new,t_new,0.25,0.25);H=[5,10,15,20,30,40];%´ýÑ¡µÄÉñ¾­Ôª¸öÊýL=length(H);rate=zeros(1,L);c=cell(1,L);fori=1:L%н¨Ò»¸öÍøÂçnet=newff(minmax(p_new),[H(i),26],{'logsig','logsig'},'traingdx');net.IW{1}=0.2*rand(H(i),35)-0.1;net.LW{2}=0.2*rand(26,H(i))-0.1;net.b{1}=0.2*rand(H(i),1)-0.1;net.b{2}=0.2*rand(26,1)-0.1;%²ÎÊýµ÷Õûnet.trainParam.epochs=5000;%10Maximumnumberofepochstotrainnet.trainParam.goal=0.001;%0Performancegoal%ѵÁ·ÍøÂç[net,tr]=train(net,trainex.P,trainex.T,[],[],validate);c{1,i}=net;%¼ìÑéÍøÂçy=sim(net,testex.P);s=0;forj=1:size(testex.T,2)ifcompet(y(:,j))==testex.T(:,j);s=s+1;endendrate(:,i)=s/j;end[h,index]=max(rate);fprintf('×îÓÅÒþ²ãÉñ¾­Ôª¸öÊýΪ£º');H(index)%¼ìÑéÍøÂçʶ±ðÄÜÁ¦net=c{1,index};var=0:0.05:0.5;l=length(var);Rate=zeros(1,l);fori=1:ls=0;fork=1:100%Ëæ»ú²úÉú100¸ö¼ÓÔë¼ìÑéÑù±¾a1=randperm(26,1);p1=p(:,a1)+sqrt(var(i))*randn(35,1);a=sim(net,p1);index=find(compet(a)==1);ifindex==a1s=s+1;endendRate(1,i)=s/100;endplot(var,Rate,'*');xlabel('ÔëÉù·½²î');ylabel('ʶ±ðÂÊ');fork=1:length(var)text(var(k),Rate(k)-0.005,['(',num2str(var(k)),',',num2str(Rate(k)),')']);endbp4.m%Ôö¼Óº¬ÔëѵÁ·Ñù±¾¸öÊýclc;clear%²úÉúѵÁ·Ñù±¾ºÍÄ¿±êÊä³öNN=[50,100,200,500,1000];hiden=30;Var=[0,0.1,0.2,0.5];Rate=zeros(length(NN),length(Var));[p,t]=prprob();[m,n]=size(p);fori=1:length(NN)%²úÉúº¬ÔëµÄѵÁ·Ñù±¾N=NN(i);p_new=repmat(p,1,N);t_new=repmat(t,1,N);noise=zeros(35,N*26);noise(:,1:n*N/2)=sqrt(0.1)*randn([m,n*N/2]);%¸ß˹°×Ôë¾ùֵΪ0£¬·½²îΪ0.1µÄѵÁ·Ñù±¾noise(:,n*N/2+1:end)=sqrt(0.2)*randn([m,n*N/2]);%¸ß˹°×Ôë¾ùֵΪ0£¬·½²îΪ0.2µÄѵÁ·Ñù±¾p_new=p_new+noise;%н¨Ò»¸öÍøÂçnet=newff(minmax(p_new),[hiden,26],{'logsig','logsig'},'traingdx');net.IW{1}=rand(hiden,35)-0.5;net.LW{2}=rand(26,hiden)-0.5;net.b{1}=rand(hiden,1)-0.5;net.b{2}=rand(26,1)-0.5;%²ÎÊýµ÷Õûnet.trainParam.epochs=5000;%10Maximumnumberofepochstotrainnet.trainParam.goal=1e-3;%0Performancegoal%ѵÁ·ÍøÂç[net,tr]=train(net,p_new,t_new);%¼ìÑéÍøÂçforj=1:length(Var)var=Var(j);s=0;K=200;fork=1:K%Ëæ»ú²úÉú200¸ö¼ÓÔë¼ìÑéÑù±¾a1=randperm(26,1);p1=p(:,a1)+sqrt(var)*randn(35,1);a=sim(net,p1);index=find(compet(a)==1);ifindex==a1s=s+1;endendRate(i,j)=s/Kendendbp5.m%Ôö¼ÓÒþ²ãÉñ¾­Ôª¸öÊýclc;clear%²úÉúѵÁ·Ñù±¾ºÍÄ¿±êÊä³öH=[30,40,50,100,150];N=100;Var=[0,0.1,0.2,0.5];Rate=zeros(length(H),length(Var));[p,t]=prprob();[m,n]=size(p);fori=1:length(H)%²úÉúº¬ÔëµÄѵÁ·Ñù±¾

温馨提示

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

最新文档

评论

0/150

提交评论