您好,欢迎访问三七文档
电气工程学院神经网络实验报告院系:电气工程学院专业:电气工程及其自动化实验二基于BP网络的多层感知器一实验目的:1.理解基于BP网络的多层感知器的工作原理2.通过调节算法参数的了解参数的变化对BP多层感知器训练的影响3.了解BP多层感知器的局限性二实验内容:1.根据实验内容推导出输出的计算公式以及误差的计算公式2.使用Matlab编程实现BP多层感知器3.调节学习率η及隐结点的个数,观察对于不同的学习率、不同的隐结点个数时算法的收敛速度4.改用批处理的方法实验权值的收敛,并加入动量项来观察批处理以及改进的的算法对结果和收敛速度的影响。三.实验原理以及过程的推导1.基本BP算法的多层感知器模型下面所示是一个单输入单输出的BP多层感知器的模型,它含有一个隐层。输出O输出层W=(w1,w2,……….wj)………….Y=(y1,y2,…….yj)隐层y0V=(v1,v2,…….vj)输入层X0X下面对误差和权值的调整过程进行推导对于单样本的输入Xi则隐层的输出:yi=f1(netj);netj=(xi*vi)输出层的输出:O=f2(net);net=(wi*yi)变换函数:f1=xe11f2=x;当网络输出与期望输出不等时,存在输出误差EE=21(d-o)2;计算各层的误差:把误差分配到各层以调整各层的权值,所以,各层权值的调整量等于误差E对各权值的负偏导与学习率的乘积,计算得到对权值W和权值V的调整量如下:将上面的式子展开到隐层得:E=21(d-o)2=21[d-f2(net)]=21[d-f2(ijiiiyw1)]将上式展开到输入层得:E=21(d-o)2=21[d-f2(net)]=21[d-f2(ijiiiw1f1(ijiiixv1))]调整权值的原则是使误差不断地减小,因此应使权值的调整量与误差的梯度下降成正比,即Δwj=-jWEΔvj=-jVE计算得到对各权值的调整为:Δwj=η*(d(1,p)-o(1,p))*y(1,i)Δvj=*(d(1,p)-o(1,p))*w(1,i)*y(1,i)*(1-y(1,i))*x(1,p)其中P为第P个样本:四实验步骤Step1初始化对权值矩阵W、V赋随机数,将样本模式计数器p和训练次数计数器q置于1,误差E置0,学习率η设为0~1内的小数,网络训练后的精度Emin设为一个正的小数;Step2输入训练样本对,计算各层输出用当前样本Xp、dp对向量数组X、d赋值,用下式计算Y和O中各分量yi=f1(netj);netj=(xi*vi)O=f2(netj);net=(wi*yi)Step3计算网络输出误差设共有P对训练样本,网络对于不同的样本具有不同的误差2Step4计算各层误差信号:各层的误差信号为误差E对各层权值的偏导Step5调整各层权值Δw=η*(d(1,p)-o(1,p))*y(1,i)Δv=*(d(1,p)-o(1,p))*w(1,i)*y(1,i)*(1-y(1,i))*x(1,p)Step6检查是否对所有样本完成一次轮训若pP,计算器p=p+1,q=q+1,返回Step2,否则转到Step7Step7检查网络总误差是否达到精度要求当用ERME作为网络的总误差时,若满足ERMEEmin,训练结束,否则E置0,p置1,返回Step2。单样本训练:每输入一个样本,都要回传误差并调整权值,会导致收敛速度过慢批处理(Batch)训练:根据总误差,计算各层的误差信号并调整权值,在样本数较多时,批训练比单样本训练时的收敛速度快五实验结果对于单本输入的网络程序如下:functionlimoyan;%建立以limoyan为文件名的m文件clc;clear;x=[-4:0.08:4];%产生样本j=input('j=');%输入隐结点的个数n=input('n=');%输入学习率w=rand(1,j);%对权值w赋较小的初值w0=0.5;%对权值w0赋较小的初值v=rand(1,j);%对权值V赋较小的初值v1=rand(1,j);%对权值V1赋较小的初值x0=-1;%对阈值x0赋初值y0=-1;%对阈值y0赋初值err=zeros(1,101);wucha=0;erro=[];Erme=0;zong=[];Emin=0.1;d=zeros(1,101);%以初值0赋给期望输出form=1:101d(1,m)=1.1*(1.0-x(1,m)+2*x(1,m)*x(1,m))*exp(-x(1,m)*x(1,m)/2);%以Hermit多项式产生期望输出end;o=zeros(1,101);netj=zeros(1,j);net=zeros(1,j);y=zeros(1,j);p=1;q=1;whileq30000%设定最大的迭代交数forp=1:101%计算隐层的输出fori=1:jnetj(1,i)=v(1,i)*x(1,p)+v1(1,i)*x0;y(1,i)=1/(1+exp(-netj(1,i)));end;o(1,p)=w*y'+y0*w0+0.01*randn(1,1);%计算输出并给输出加上上定的扰动wucha=1/2*(d(1,p)-o(1,p))*(d(1,p)-o(1,p));%计算误差err(1,p)=wucha;erro=[erro,wucha];form=1:j;%调整各层的权值w0=w0-n*w0;w(1,m)=w(1,m)+n*(d(1,p)-o(1,p))*y(1,m);v(1,m)=v(1,m)+n*(d(1,p)-o(1,p))*w(1,m)*y(1,m)*(1-y(1,m))*x(1,p);v1(1,m)=v1(1,m)+n*(d(1,p)-o(1,p))*w(1,m)*y(1,m)*(1-y(1,m))*x0;end;q=q+1;end;Erme=0;fort=1:101;Erme=Erme+err(1,t);end;err=zeros(1,101);Erme=sqrt(Erme/101);zong=[zong,Erme];ifErmeEminbreak;%误差达到允许值时停止迭代end;end;%输入结果Ermeplot(x,d,'-r');holdon;plot(x,o,'-.b');xlabel('Hermit多项式曲线与所构建BP网络输出曲线')qfigure(2);plot(zong);xlabel('误差的收敛曲线')命令窗口的输出如下:j=5n=0.05Erme=0.0996q=19999Hermit多项式曲线与所构建BP网络输出曲线:误差的收敛曲线如下:单样本训练的统计如下:0.050.070.10.120.150.1750.093600.086590.097840.093640.087250.0932480.099210.089210.094580.091250.084570.09478100.89250.087940.085270.091450.084120.09147120.097840.092580.087960.091580.078360.08397对于批处理的情况:在原程序的基础上改变中间的一段;命令窗口的输出如下:j=10n=0.1Erme=0.0997q=15757Hermit多项式曲线与所构建BP网络输出曲线:学习率结点数误差的收敛曲线如下:单样本训练的统计如下:0.050.070.10.120.150.1750.099060.095870.094570.090960.099140.0987470.092580.091050.092670.091580.094570.09547100.089420.093240.091280.084570.092170.09527120.085960.089250.087590.091540.082470.09457对于加入动量项的网络如下:命令窗口的输出如下:j=15n=0.1Erme=0.1000q=6768Hermit多项式曲线与所构建BP网络输出曲线:学习率结点数误差的收敛曲线如下:单样本训练的统计如下:0.050.070.10.120.150.1750.096570.095780.096540.0983540.098240.0904780.096580.093680.093420.096480.094270.09153100.092570.094570.092310.094260.095470.08972120.092580.92150.091270.092380.093410.08931六.问题回答1.比较单样本训练和批处理训练的区别;答:单样本输入是每输入一个样本就调整一次权值,并计算误差的大小,而学习率结点数对于批处理来说,是等所有的样本都输入以后再调整权值.当样本较多的时候批处理能获得较快的收敛速度.2.根据结果分析增加动量项后算法的变化答:加入动量项后,就等于让权值的收敛方向向着一定的方向进行,由输出的数据可以看出这一点,对于相同的结点数,相同的学习率,加入动量项后,收速度即迭代次数明显的降低.2改变不同参数的BP网络运行情况及结果,并给予相应的结果分析答:改变不同参数,对网络运行情况的影响,可以概括为:随着结点数的增多,收敛的概率和速度都会相应的有把增加.相应的误差会要小一点.但误差的大小除了取决于结点外,还主要决定于到达允许误差时的值,所以总误差的值有一定的随机性.对于改变网络的学习率,对来说小的学习率会使收敛更稳定一点,但是速度也会相对地慢一点,大的学习率在一定程度上能加快收敛的速度,但是稳定性要比小的学习率小的多,换句话说,大的学习率收敛的概率要小得多,很容易发散,所以说,随着学习的增大,迭代的次数会先减小后增大。大到一定程度进,由于波动太大。结果就不在收敛;3思考:输出层可以采用Sigmoid函数吗?为什么?答:输出层可以采用的函数很多,从理论上说,一个函数都是可以应用的,但是如果采用Sigmoid函数的话,占用的内存要比用线性函数大的多,相对的运行的速度也要比用线性函数慢的多,而对于连续的函数的拟合,输出函数用线性函数就能很好的解决。4试验中遇到的问题和解决方法答:在开始的时候把问题想得太简单,在没有加阈值的情下编出了程序,运行后才发现,结点数很多,想明白后再阈值加上使程序显得混乱。
本文标题:神经网络实验报告
链接地址:https://www.777doc.com/doc-5827723 .html