神经网络实验报告-吐血推荐Word下载.doc
《神经网络实验报告-吐血推荐Word下载.doc》由会员分享,可在线阅读,更多相关《神经网络实验报告-吐血推荐Word下载.doc(16页珍藏版)》请在冰点文库上搜索。
V=(v1,v2,…….vj)
输入层
X0X
下面对误差和权值的调整过程进行推导
对于单样本的输入Xi则隐层的输出:
yi=f1(netj);
netj=(xi*vi)
输出层的输出:
O=f2(net);
net=(wi*yi)
变换函数:
f1=
f2=x;
当网络输出与期望输出不等时,存在输出误差E
E=(d-o)2;
计算各层的误差:
把误差分配到各层以调整各层的权值,所以,各层权值的调整量等于误差E对各权值的负偏导与学习率的乘积,计算得到对权值W和权值V的调整量如下:
将上面的式子展开到隐层得:
E=(d-o)2=[d-f2(net)]=[d-f2()]
将上式展开到输入层得:
E=(d-o)2=[d-f2(net)]=[d-f2(f1())]
调整权值的原则是使误差不断地减小,因此应使权值的调整量与误差的梯度下降成正比,即
Δwj=-
Δvj=-
计算得到对各权值的调整为:
Δ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中各分量
O=f2(netj);
Step3计算网络输出误差
设共有P对训练样本,网络对于不同的样本具有不同的误差2å
Step4计算各层误差信号:
各层的误差信号为误差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检查是否对所有样本完成一次轮训
若p<
P,计算器p=p+1,q=q+1,返回Step2,否则转到Step7
Step7检查网络总误差是否达到精度要求
当用ERME作为网络的总误差时,若满足ERME<
Emin,训练结束,否则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:
101
d(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;
whileq<
30000%设定最大的迭代交数
forp=1:
101%计算隐层的输出
fori=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+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;
q=q+1;
end;
Erme=0;
fort=1:
101;
Erme=Erme+err(1,t);
err=zeros(1,101);
Erme=sqrt(Erme/101);
zong=[zong,Erme];
ifErme<
Eminbreak;
%误差达到允许值时停止迭代
%输入结果
Erme
plot(x,d,'
-r'
holdon;
plot(x,o,'
-.b'
xlabel('
Hermit多项式曲线与所构建BP网络输出曲线'
)
q
figure
(2);
plot(zong);
误差的收敛曲线'
命令窗口的输出如下:
j=5
n=0.05
Erme=0.0996
q=19999
Hermit多项式曲线与所构建BP网络输出曲线:
误差的收敛曲线如下:
单样本训练的统计如下:
学
习
率
结
点
数
0.05
0.07
0.1
0.12
0.15
0.17
5
0.09360
0.08659
0.09784
0.09364
0.08725
0.09324
8
0.09921
0.08921
0.09458
0.09125
0.08457
0.09478
10
0.8925
0.08794
0.08527
0.09145
0.08412
0.09147
12
0.09258
0.08796
0.09158
0.07836
0.08397
对于批处理的情况:
在原程序的基础上改变中间的一段;
j=10
n=0.1
Erme=0.0997
q=15757
0.09906
0.09587
0.09457
0.09096
0.09914
0.09874
7
0.09105
0.09267
0.09547
0.08942
0.09128
0.09217
0.09527
0.08596
0.08925
0.08759
0.09154
0.08247
对于加入动量项的网络如下:
命令窗口的输出如下:
j=15
Erme=0.1000
q=6768
误差的收敛曲线如下
:
0.09657
0.09578
0.09654
0.098354
0.09824
0.09047
0.09658
0.09368
0.09342
0.09648
0.09427
0.09153
0.09257
0.09231
0.09426
0.08972
0.9215
0.09127
0.09238
0.09341
0.08931
六.问题回答
1.比较单样本训练和批处理训练的区别;
答:
单样本输入是每输入一个样本就调整一次权值,并计算误差的大小,而对于批处理来说,是等所有的样本都输入以后再调整权值.当样本较多的时候批处理能获得较快的收敛速度.
2.根据结果分析增加动量项后算法的变化
加入动量项后,就等于让权值的收敛方向向着一定的方向进行,由输出的数据可以看出这一点,对于相同的结点数,相同的学习率,加入动量项后,收速度即迭代次数明显的降低.
2改变不同参数的BP网络运行情况及结果,并给予相应的结果分析
改变不同参数,对网络运行情况的影响,可以概括为:
随着结点数的增多,收敛的概率和速度都会相应的有把增加.相应的误差会要小一点.但误差的大小除了取决于结点外,还主要决定于到达允许误差时的值,所以总误差的值有一定的随机性.对于改变网络的学习率,对来说小的学习率会使收敛更稳定一点,但是速度也会相对地慢一点,大的学习率在一定程度上能加快收敛的速度,但是稳定性要比小的学习率小的多,换句话说,大的学习率收敛的概率要小得多,很容易发散,所以说,随着学习的增大,迭代的次数会先减小后增大。
大到一定程度进,由于波动太大。
结果就不在收敛;
3思考:
输出层可以采用Sigmoid函数吗?
为什么?
答:
输出层可以采用的函数很多,从理论上说,一个函数都是可以应用的,但是如果采用Sigmoid函数的话,占用的内存要比用线性函数大的多,相对的运行的速度也要比用线性函数慢的多,而对于连续的函数的拟合,输出函数用线性函数就能很好的解决。
4试验中遇到的问题和解决方法
在开始的时候把问题想得太简单,在没有加阈值的情下编出了程序,运行后才发现,结点数很多,想明白后再阈值加上使程序显得混乱。