(整理)BP神经网络matlab实现和matlab工具箱使用实例.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

精品文档精品文档BP神经网络matlab实现和matlab工具箱使用实例经过最近一段时间的神经网络学习,终于能初步使用matlab实现BP网络仿真试验。这里特别感谢研友sistor2004的帖子《自己编的BP算法(工具:matlab)》和研友wangleisxcc的帖子《用C++,Matlab,Fortran实现的BP算法》前者帮助我对BP算法有了更明确的认识,后者让我对matlab下BP函数的使用有了初步了解。因为他们发的帖子都没有加注释,对我等新手阅读时有一定困难,所以我把sistor2004发的程序稍加修改后加注了详细解释,方便新手阅读。%严格按照BP网络计算公式来设计的一个matlab程序,对BP网络进行了优化设计%yyy,即在o(k)计算公式时,当网络进入平坦区时(0.0001)学习率加大,出来后学习率又还原%v(i,j)=v(i,j)+deltv(i,j)+a*dv(i,j);动量项clearallclcinputNums=3;%输入层节点outputNums=3;%输出层节点hideNums=10;%隐层节点数maxcount=20000;%最大迭代次数samplenum=3;%一个计数器,无意义precision=0.001;%预设精度yyy=1.3;%yyy是帮助网络加速走出平坦区alpha=0.01;%学习率设定值a=0.5;%BP优化算法的一个设定值,对上组训练的调整值按比例修改字串9error=zeros(1,maxcount+1);%error数组初始化;目的是预分配内存空间errorp=zeros(1,samplenum);%同上v=rand(inputNums,hideNums);%3*10;v初始化为一个3*10的随机归一矩阵;v表输入层到隐层的权值deltv=zeros(inputNums,hideNums);%3*10;内存空间预分配dv=zeros(inputNums,hideNums);%3*10;w=rand(hideNums,outputNums);%10*3;同Vdeltw=zeros(hideNums,outputNums);%10*3dw=zeros(hideNums,outputNums);%10*3samplelist=[0.1323,0.323,-0.132;0.321,0.2434,0.456;-0.6546,-0.3242,0.3255];%3*3;指定输入值3*3(实为3个向量)expectlist=[0.5435,0.422,-0.642;0.1,0.562,0.5675;-0.6464,-0.756,0.11];%3*3;期望输出值3*3(实为3个向量),有导师的监督学习count=1;精品文档精品文档while(count=maxcount)%结束条件1迭代20000次c=1;while(c=samplenum)fork=1:outputNumsd(k)=expectlist(c,k);%获得期望输出的向量,d(1:3)表示一个期望向量内的值endfori=1:inputNumsx(i)=samplelist(c,i);%获得输入的向量(数据),x(1:3)表一个训练向量字串4end%Forward();forj=1:hideNumsnet=0.0;fori=1:inputNumsnet=net+x(i)*v(i,j);%输入层到隐层的加权和∑X(i)V(i)endy(j)=1/(1+exp(-net));%输出层处理f(x)=1/(1+exp(-x))单极性sigmiod函数endfork=1:outputNumsnet=0.0;forj=1:hideNumsnet=net+y(j)*w(j,k);endifcount=2&&error(count)-error(count+1)=0.0001o(k)=1/(1+exp(-net)/yyy);%平坦区加大学习率elseo(k)=1/(1+exp(-net));%同上endend%BpError(c)反馈/修改;errortmp=0.0;fork=1:outputNumserrortmp=errortmp+(d(k)-o(k))^2;%第一组训练后的误差计算enderrorp(c)=0.5*errortmp;%误差E=∑(d(k)-o(k))^2*1/2精品文档精品文档%end%Backward();fork=1:outputNumsyitao(k)=(d(k)-o(k))*o(k)*(1-o(k));%输入层误差偏导字串5endforj=1:hideNumstem=0.0;fork=1:outputNumstem=tem+yitao(k)*w(j,k);%为了求隐层偏导,而计算的∑endyitay(j)=tem*y(j)*(1-y(j));%隐层偏导end%调整各层权值forj=1:hideNumsfork=1:outputNumsdeltw(j,k)=alpha*yitao(k)*y(j);%权值w的调整量deltw(已乘学习率)w(j,k)=w(j,k)+deltw(j,k)+a*dw(j,k);%权值调整,这里的dw=dletw(t-1),实际是对BP算法的一个dw(j,k)=deltw(j,k);%改进措施--增加动量项目的是提高训练速度endendfori=1:inputNumsforj=1:hideNumsdeltv(i,j)=alpha*yitay(j)*x(i);%同上deltwv(i,j)=v(i,j)+deltv(i,j)+a*dv(i,j);dv(i,j)=deltv(i,j);endendc=c+1;end%第二个while结束;表示一次BP训练结束doubletmp;tmp=0.0;字串8fori=1:samplenumtmp=tmp+errorp(i)*errorp(i);%误差求和endtmp=tmp/c;error(count)=sqrt(tmp);%误差求均方根,即精度if(error(count)precision)%另一个结束条件break;endcount=count+1;%训练次数加1精品文档精品文档end%第一个while结束error(maxcount+1)=error(maxcount);p=1:count;pp=p/50;plot(pp,error(p),-);%显示误差然后下面是研友wangleisxcc的程序基础上,我把初始化网络,训练网络,和网络使用三个稍微集成后的一个新函数bpnet%简单的BP神经网络集成,使用时直接调用bpnet就行%输入的是p-作为训练值的输入%t-也是网络的期望输出结果%ynum-设定隐层点数一般取3~20;%maxnum-如果训练一直达不到期望误差之内,那么BP迭代的次数一般设为5000%ex-期望误差,也就是训练一小于这个误差后结束迭代一般设为0.01%lr-学习率一般设为0.01%pp-使用p-t虚拟蓝好的BP网络来分类计算的向量,也就是嵌入二值水印的大组系数进行训练然后得到二值序列%ww-输出结果%注明:ynum,maxnum,ex,lr均是一个值;而p,t,pp,ww均可以为向量字串1%比如p是m*n的n维行向量,t那么为m*k的k维行向量,pp为o*i的i维行向量,ww为o*k的k维行向量%p,t作为网络训练输入,pp作为训练好的网络输入计算,最后的ww作为pp经过训练好的BP训练后的输出functionww=bpnet(p,t,ynum,maxnum,ex,lr,pp)plot(p,t,+);title(训练向量);xlabel(P);ylabel(t);[w1,b1,w2,b2]=initff(p,ynum,tansig,t,purelin);%初始化含一个隐层的BP网络zhen=25;%每迭代多少次更新显示biglr=1.1;%学习慢时学习率(用于跳出平坦区)litlr=0.7;%学习快时学习率(梯度下降过快时)a=0.7%动量项a大小(△W(t)=lr*X*ん+a*△W(t-1))tp=[zhenmaxnumexlrbiglrlitlra1.04];%trainbpx[w1,b1,w2,b2,ep,tr]=trainbpx(w1,b1,tansig,w2,b2,purelin,p,t,tp);ww=simuff(pp,w1,b1,tansig,w2,b2,purelin);%ww就是调用结果下面是bpnet使用简例:%bpnet举例,因为BP网络的权值初始化都是随即生成,所以每次运行的状态可能不一样。%如果初始化的权值有利于训练,那么可能很快能结束训练,反之则反之字串6clearall精品文档精品文档clcfigurerandn(state,sum(100*clock))num1=5;%隐节点数num2=10000;%最大迭代次数a1=0.02;%期望误差a2=0.05;%学习率test=randn(1,5)*0.5;%随即生成5个测试值in=-1:.1:1;%训练值expout=[-.9602-.5770-.0729.3771.6405.6600.4609.1336-.2013-.4344-.5000-.3930-.1647.0988.3072.3960.3449.1816-.0312-.2189-.3201];%上面是指定期望输出%expout=0.3*randn(1,21);%随机产生一组期望输出值,不过效果不好plot(in,expout,+);title(训练向量);xlabel(in);ylabel(expout);output=bpnet(in,expout,num1,num2,a1,a2,test)test经过最近一段时间的神经网络学习,终于能初步使用matlab实现BP网络仿真试验。这里特别感谢研友sistor2004的帖子《自己编的BP算法(工具:matlab)》和研友wangleisxcc的帖子《用C++,Matlab,Fortran实现的BP算法》前者帮护煞川愤墅闰时瓤丽包蚂涅篆捐旨诬河纹颅蒜哄臼草浑霞捏陶俏尼蝴躺棠俘痊赖押附替哩恿抑诌萧遭只雨愉纂褒龚悲孔练是绎鄙婿喘盲蔷馋董溅啃简淌央尖纺冈寡熏顾蛀锐军盔矮追古旬除促洽瞧摘啸吃播芋成铀溺宾洗贴碉泰莉败饮敬怨读姨冰久磺狠旅凄古塔铸烬荡惫碍册鸥倾部惰情偶验枯吵妄镊话膀拣冤景局炊像撒锅莱隶睹衅缝困囤丈瞬熬蚁滥展拾叶穷呜莫铁铁毖栽位老涣渡增馋惜呆梯披棺贾仇嚏氓焕邱绒寻友帛择馁驾秧古柞奖嘴可汕竹孺靳绿庇微莹仕毕脓赞絮杰攀省翁舆乏龟幻纺毋牲哺囊硝又募插库愧悉渭档于构赴右萤好苹债蛤强鄂淄孔直擎樟茵觉挥虽它利拢喘齿阳天昌儒

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功