神经网络实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
神经网络及应用实验报告院系:电气工程学院
班级:电气工程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:101
d(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:5
while q<30000 %设定最大的迭代交数
for p=1:101 %计算隐层的输出
for i=1:j
netj(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 end; end;%输入结果 azc=azc+Erme; acs=acs+q; end disp('平均误差:'); pjwc=1/5*azc