神经网络基于BP网络的多层感知器实验报告二、基于BP网络的多层感知器一:实验目的:1、理解多层感知器的工作原理2、通过调节算法参数了解参数的变化对于感知器训练的影响3、了解多层感知器局限性二:实验原理:BP的基本思想:信号的正向传播误差的反向传播–信号的正向传播:输入样本从输入层传入,经各隐层逐层处理后,传向输出层。
–误差的反向传播:将输入误差以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号来作为修正各单元权值的依据。
1、基本BP算法的多层感知器模型:2、BP学习算法的推导:当网络输出与期望输出不等时,存在输出误差E将上面的误差定义式展开至隐层,有进一步展开至输入层,有调整权值的原则是使误差不断地减小,因此应使权值的调整量与误差的梯度下降成正比,即η∈(0,1)表示比例系数,在训练中反应学习速率 BP算法属于δ学习规则类,这类算法被称为误差的梯度下降(Gradient Descent)算法。
<实验步骤>1、用Matlab编程,实现解决该问题的单样本训练BP网络,设置一个停止迭代的误差Emin和最大迭代次数。
在调试过程中,通过不断调整隐层节点数,学习率η,找到收敛速度快且误差小的一组参数。
产生均匀分布在区间[-4,4]的测试样本,输入建立的模型得到输出,与Hermit多项式的期望输出进行比较计算总误差(运行5次,取平均值),并记录下每次迭代结束时的迭代次数。
(要求误差计算使用RME,Emin 设置为0、1)程序如下:function dyb %单样本程序 clc; close all; clear; x0=[1:;-4:0、08:4];%样本个 x0(1,:)=-1; x=x0'; yuzhi=0、1;%阈值j=input('请输入隐层节点数 j = ');%隐层节点数 n=input('请输入学习效率 n = ');%学习效率 w=rand(1,j); w=[yuzhi,w]; %输出层阈值 v=rand(2,j); v(1,:)=yuzhi;%隐层阈值err=zeros(1,); wucha=0; zhaosheng=0、01*randn(1,);%噪声erro=[]; ERRO=[];%误差,为画收敛曲线准备 Emin=0、1;d=zeros(1,); for m=1: d(m)=hermit(x(m,2));%期望 end;o=zeros(1,); j=zeros(1,j); =zeros(1,j); p=1; q=1; azc=0; acs=0; for z=1:5 while q<30000 Erme=0; for p=1:y=zeros(1,j); for i=1:j j(1,i)=x(p,:)*v(:,i);y(1,i)=1/(1+exp(-j(1,i))); end; y=[-1 y];o(p)=w*y'+zhaosheng(p);%噪声 wucha = d(p)-o(p);err(1,p)=1/2*wucha^2; erro=[erro,wucha]; for m=1:j+1w(1,m)=w(1,m)+n*wucha*y(1,m); end; for m=1:jv(:,m)=v(:,m)+n*wucha*w(1,m)*y(1,m)*(1-y(1,m))*x(p,:)'; end q=q+1; end; for t=1:; Erme=Erme+err(1,t); end;err=zeros(1,); Erme=sqrt(Erme/); ERRO=[ERRO,Erme]; ifErme<Emin break; end; end; azc=azc+Erme; acs=acs+q; end disp('最终误差:'); pinjunwucha=1/5*azc figure(1);plot(x(:,2),d,'--r'); hold on; plot(x(:,2),o,'--b'); disp('次数:'); pjcx=1/5*acs figure(2); plot(ERRO); figure(3); plot(x(:,2),d,'--rp');endfunction F =hermit(x)%hermit子函数 F =1、1*(1-x+2*x^2)*exp(-x^2/2);end运行结果如下:表格1、单样本BP算法平均最小误差学习率结点数0、050、070、10、120、150、1880、09650、08590、019530、09450、08740、0925100、09680、09440、09830、09200、08210、0982120、08860、08560、08850、09460、08340、0928150、09150、09270、08780、09240、07380、08442、实现解决该问题的批处理训练BP网络,调整参数如上。
产生均匀分布在区间[-4,4]的测试样本,输入建立的模型得到输出,与Hermit多项式的期望输出进行比较计算总误差(运行5次,取平均值),并记录下每次迭代结束时的迭代次数。
程序如下:function pcl %批处理 close all; clc; x=[-4:0、08:4];%样本个 j=input('请输入隐层节点数 j = ');%隐层节点数n=input('请输入学习效率 n = ');%学习效率 a=0、1;%动量系数w=rand(1,j); v=rand(1,j); err=zeros(1,); wucha=0;zhaosheng=0、01*randn(1,);%噪声 erro=[]; ERRO=[];%误差,为画收敛曲线准备 Emin=0、1; d=zeros(1,); for m=1:d(1,m)=hermit(x(m));%期望 end; o=zeros(1,); j=zeros(1,j); =zeros(1,j); y=zeros(1,j); p=1; q=1; azc=0; acs=0; forz=1:5 while q<30000 Erro=0; Erme=0; for p=1: for i=1:jj(1,i)=v(1,i)*x(1,p); y(1,i)=1/(1+exp(-j(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; fort=1:; 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/); ERRO=[ERRO,Erme]; if Erme<Emin break; end; end; azc=azc+Erme; acs=acs+q; end disp('平均误差:'); pjwc=1/5*azc figure(1); plot(x,d,'--r'); hold on;plot(x,o,'--b'); disp('平均次数:'); pjcs=1/5*acsfigure(2); plot(ERRO); figure(3); plot(x,d);endfunction F = hermit(x)%hermit子函数 F =1、1*(1-x+2*x^2)*exp(-x^2/2);end运行结果如下:表格2、批处理BP算法平均最小误差学习率结点数0、050、070、20、1 50、17 50、096 60、097 30、097 40、098 60、099 30、0913 80、097 20、093 30、091 30、097 60、092 20、0915 100、094 50、095 70、093 70、094 80、095 70、08171 20、09250、09110、09520、09370、09153、对批处理训练BP算法增加动量项调整参数如上,记录结果,并与没有带动量项的批处理训练BP算法的结果相比较程序如下:function jdlx %加动量项 close all; clc; x=[-4:0、08:4];%样本个 j=input('请输入隐层节点数 j = ');%隐层节点数 n=input('请输入学习效率 n = ');%学习效率 a=0、1;%动量系数 w=rand(1,j); v=rand(1,j); err=zeros(1,); wucha=0; zhaosheng=0、01*randn(1,);%噪声 erro=[]; ERRO=[];%误差,为画收敛曲线准备 Emin=0、1; d=zeros(1,); for m=1:d(1,m)=hermit(x(m));%期望 end; o=zeros(1,); j=zeros(1,j); =zeros(1,j); y=zeros(1,j); p=1; q=1; azc=0; acs=0; forz=1:5 while q<30000 Erro=0; Erme=0; for p=1: for i=1:jj(1,i)=v(1,i)*x(1,p); y(1,i)=1/(1+exp(-j(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; fort=1:; Erro=Erro+erro(t); Erme=Erme+err(1,t); end; erro=[]; for m=1:j; if m==1 w(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/); ERRO=[ERRO,Erme]; if Erme<Emin break; end; end; azc=azc+Erme; acs=acs+q; end disp('平均误差:'); pjwc=1/5*azc figure(1); plot(x,d,'--r'); hold on;plot(x,o,'--b'); disp('平均次数:'); pjcs=1/5*acsfigure(2); plot(ERRO); figure(3); plot(x,d);endfunction F = hermit(x)%hermit子函数 F =1、1*(1-x+2*x^2)*exp(-x^2/2);end运行结果如下:4、对批处理BP算法改变参数:学习率η、迭代次数、隐层节点数,观察算法的收敛发散,以及测试误差的变化(对每个参数取几个不同参数,分别运行5次,结果取平均值)。