神经网络及应用实验报告院系:电气工程学院班级:电气工程dsfasd姓名: dsfa学号: dfad7时间: 2009-11-28实验二基于BP网络的多层感知器一:实验原理:BP的基本思想:信号的正向传播误差的反向传播–信号的正向传播:输入样本从输入层传入,经各隐层逐层处理后,传向输出层。
–误差的反向传播:将输入误差以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号来作为修正各单元权值的依据。
1.基本BP算法的多层感知器模型:2.BP学习算法的推导:当网络输出与期望输出不等时,存在输出误差E将上面的误差定义式展开至隐层,有进一步展开至输入层,有调整权值的原则是使误差不断地减小,因此应使权值的调整量与误差的梯度下降成正比,即η∈(0,1)表示比例系数,在训练中反应学习速率BP算法属于δ学习规则类,这类算法被称为误差的梯度下降(Gradient Descent)算法。
二:实验内容:Hermit多项式如下式所示:f(x)=1.1(1-x+2x^2)exp(-x^2/2)采用BP算法设计一个单输入单输出的多层感知器对该函数进行逼近。
训练样本按以下方法产生:样本数P=100,其中输入样本xi服从区间[-4,4]内的均匀分布,样本输出为F(xi)+ei ,ei为添加的噪声,服从均值为0,标准差为0.1的正态分布。
隐层采用Sigmoid激活函数f(x)=1/(1+1/e^x),输出层采用线性激活函数f(x)=x。
注意:输出层采用的线性激活函数,不是Sigmoid激活函数,所以迭代公式需要根据前面的推导过程重新推导。
三:实验步骤:1. 用Matlab编程,实现解决该问题的单样本训练BP网络,设置一个停止迭代的误差E min和最大迭代次数。
在调试过程中,通过不断调整隐层节点数,学习率η,找到收敛速度快且误差小的一组参数。
产生均匀分布在区间[-4,4]的测试样本,输入建立的模型得到输出,与Hermit多项式的期望输出进行比较计算总误差(运行5次,取平均值),并记录下每次迭代结束时的迭代次数。
(要求误差计算使用RME,Emin 设置为0.1)程序如下:function danyangben1%建立以danyangben1为文件名的m文件clc;close all;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);zhaosheng=0.01*randn(1,101);%噪声wucha=0;erro=[];Erme=0;yadong=[];Emin=0.1;d=zeros(1,101);%以初值0赋给期望输出for m=1:101d(1,m)=hermit(x(1,m));%以Hermit多项式产生期望输出end;o=zeros(1,101);netj=zeros(1,j);net=zeros(1,j);y=zeros(1,j);p=1;q=1;azc=0;acs=0;for z=1:5while q<30000 %设定最大的迭代交数for p=1:101 %计算隐层的输出for i=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+zhaosheng(p);%计算输出并给输出加上上定的扰动 wucha=1/2*(d(1,p)-o(1,p))*(d(1,p)-o(1,p));%计算误差err(1,p)=wucha;erro=[erro,wucha];for m=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;for t=1:101;Erme=Erme+err(1,t);end;err=zeros(1,101);Erme=sqrt(Erme/101);yadong=[yadong,Erme];if Erme<Emin break;%误差达到允许值时停止迭代end;end;%输入结果azc=azc+Erme;acs=acs+q;enddisp('平均误差:');pjwc=1/5*azcplot(x,d,'--r');hold on;plot(x,o,'--b');disp('平均次数:');pjcx=1/5*acsfigure(2);plot(yadong);figure(3);plot(x,d);endfunction F = hermit(x)F = 1.1*(1-x+2*x^2)*exp(-x^2/2); end-4-3-2-1012342. 实现解决该问题的批处理训练BP网络,调整参数如上。
产生均匀分布在区间[-4,4]的测试样本,输入建立的模型得到输出,与Hermit多项式的期望输出进行比较计算总误差(运行5次,取平均值),并记录下每次迭代结束时的迭代次数。
程序如下:运行结果如下:function pichuli %批处理close all;clc;x=[-4:0.08:4];%样本101个j=input('请输入隐层节点数 j = ');%隐层节点数 n=input('请输入学习效率 n = ');%学习效率a=0.1;%动量系数w=rand(1,j);v=rand(1,j);err=zeros(1,101);wucha=0;zhaosheng=0.01*randn(1,101);%噪声erro=[];ERRO=[];%误差,为画收敛曲线准备Emin=0.1;d=zeros(1,101);for m=1:101d(1,m)=hermit(x(m));%期望end;o=zeros(1,101);netj=zeros(1,j);net=zeros(1,j);y=zeros(1,j);p=1;q=1;while q<30000Erro=0;Erme=0;for p=1:101for i=1:jnetj(1,i)=v(1,i)*x(1,p);y(1,i)=1/(1+exp(-netj(1,i)));end;o(1,p)=w*y'+zhaosheng(p);%噪声wucha=d(1,p)-o(1,p);%误差err(1,p)=1/2*wucha^2;erro=[erro,wucha];q=q+1;end;for t=1:101;Erro=Erro+erro(t);Erme=Erme+err(1,t);end;erro=[];for m=1:j;w(1,m)=w(1,m)+n*Erro*y(1,m);v(1,m)=v(1,m)+n*Erro*w(1,m)*y(1,m)*(1-y(1,m))*x(1,p); end;Erme=sqrt(Erme/101);ERRO=[ERRO,Erme];if Erme<Emin break;end;end;figure(1);plot(x,d,'--r');hold on;plot(x,o,'--b');qfigure(2);plot(ERRO);figure(3);plot(x,d);endfunction F = hermit(x) %子函数F = 1.1*(1-x+2*x^2)*exp(-x^2/2);end-4-3-2-1012343. 对批处理训练BP算法增加动量项调整参数如上,记录结果,并与没有带动量项的批处理训练BP算法的结果相比较程序如下:运行结果如下:function pichuli %批处理close all;clc;x=[-4:0.08:4];%样本101个j=input('请输入隐层节点数 j = ');%隐层节点数n=input('请输入学习效率 n = ');%学习效率a=0.1;%动量系数w=rand(1,j);v=rand(1,j);err=zeros(1,101);wucha=0;zhaosheng=0.01*randn(1,101);%噪声erro=[];ERRO=[];%误差,为画收敛曲线准备Emin=0.1;d=zeros(1,101);for m=1:101d(1,m)=hermit(x(m));%期望end;o=zeros(1,101);netj=zeros(1,j);net=zeros(1,j);y=zeros(1,j);p=1;q=1;while q<30000Erro=0;Erme=0;for p=1:101for i=1:jnetj(1,i)=v(1,i)*x(1,p);y(1,i)=1/(1+exp(-netj(1,i)));end;o(1,p)=w*y'+zhaosheng(p);%噪声wucha=d(1,p)-o(1,p);%误差err(1,p)=1/2*wucha^2;erro=[erro,wucha];q=q+1;end;for t=1:101;Erro=Erro+erro(t);Erme=Erme+err(1,t);end;erro=[];for m=1:j;if m==1w(1,m)=w(1,m)+n*Erro*y(1,m);elsew(1,m)=w(1,m)+n*Erro*y(1,m)+a*w(1,m-1);endv(1,m)=v(1,m)+n*Erro*w(1,m)*y(1,m)*(1-y(1,m))*x(1,p); end;Erme=sqrt(Erme/101);ERRO=[ERRO,Erme];if Erme<Emin break;end;end;figure(1);plot(x,d,'--r');hold on;plot(x,o,'--b');qfigure(2);plot(ERRO);figure(3);plot(x,d);endfunction F = hermit(x) %子函数F = 1.1*(1-x+2*x^2)*exp(-x^2/2); End-4-3-2-1012344. 对批处理BP算法改变参数:学习率η、迭代次数、隐层节点数,观察算法的收敛发散,以及测试误差的变化(对每个参数取几个不同参数,分别运行5次,结果取平均值)。