神经网络实验报告-吐血推荐.doc
《神经网络实验报告-吐血推荐.doc》由会员分享,可在线阅读,更多相关《神经网络实验报告-吐血推荐.doc(16页珍藏版)》请在冰点文库上搜索。
电气工程学院
神经网络实验报告
院系:
电气工程学院
专业:
电气工程及其自动化
班级:
电sdfasdf
姓名:
adsdf
学号:
20df
实验二基于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)
隐层y0
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中各分量
yi=f1(netj);
netj=(xi*vi)
O=f2(netj);
net=(wi*yi)
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
Step7检查网络总误差是否达到精度要求
当用ERME作为网络的总误差时,若满足ERME单样本训练:
每输入一个样本,都要回传误差并调整权值,会导致收敛速度过慢
批处理(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;
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];
ifErmeend;
end;%输入结果
Erme
plot(x,d,'-r');
holdon;
plot(x,o,'-.b');
xlabel('Hermit多项式曲线与所构建BP网络输出曲线')
q
figure
(2);
plot(zong);
xlabel('误差的收敛曲线')
命令窗口的输出如下:
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.09784
0.09258
0.08796
0.09158
0.07836
0.08397
对于批处理的情况:
在原程序的基础上改变中间的一段;
命令窗口的输出如下:
j=10
n=0.1
Erme=0.0997
q=15757
Hermit多项式曲线与所构建BP网络输出曲线:
误差的收敛曲线如下:
单样本训练的统计如下:
学
习
率
结
点
数
0.05
0.07
0.1
0.12
0.15
0.17
5
0.09906
0.09587
0.09457
0.09096
0.09914
0.09874
7
0.09258
0.09105
0.09267
0.09158
0.09457
0.09547
10
0.08942
0.09324
0.09128
0.08457
0.09217
0.09527
12
0.08596
0.08925
0.08759
0.09154
0.08247
0.09457
对于加入动量项的网络如下:
命令窗口的输出如下:
j=15
n=0.1
Erme=0.1000
q=6768
Hermit多项式曲线与所构建BP网络输出曲线:
误差的收敛曲线如下
:
单样本训练的统计如下:
学
习
率
结
点
数
0.05
0.07
0.1
0.12
0.15
0.17
5
0.09657
0.09578
0.09654
0.098354
0.09824
0.09047
8
0.09658
0.09368
0.09342
0.09648
0.09427
0.09153
10
0.09257
0.09457
0.09231
0.09426
0.09547
0.08972
12
0.09258
0.9215
0.09127
0.09238
0.09341
0.08931
六.问题回答
1.比较单样本训练和批处理训练的区别;
答:
单样本输入是每输入一个样本就调整一次权值,并计算误差的大小,而对于批处理来说,是等所有的样本都输入以后再调整权值.当样本较多的时候批处理能获得较快的收敛速度.
2.根据结果分析增加动量项后算法的变化
答:
加入动量项后,就等于让权值的收敛方向向着一定的方向进行,由输出的数据可以看出这一点,对于相同的结点数,相同的学习率,加入动量项后,收速度即迭代次数明显的降低.
2改变不同参数的BP网络运行情况及结果,并给予相应的结果分析
答:
改变不同参数,对网络运行情况的影响,可以概括为:
随着结点数的增多,收敛的概率和速度都会相应的有把增加.相应的误差会要小一点.但误差的大小除了取决于结点外,还主要决定于到达允许误差时的值,所以总误差的值有一定的随机性.对于改变网络的学习率,对来说小的学习率会使收敛更稳定一点,但是速度也会相对地慢一点,大的学习率在一定程度上能加快收敛的速度,但是稳定性要比小的学习率小的多,换句话说,大的学习率收敛的概率要小得多,很容易发散,所以说,随着学习的增大,迭代的次数会先减小后增大。
大到一定程度进,由于波动太大。
结果就不在收敛;
3思考:
输出层可以采用Sigmoid函数吗?
为什么?
答:
输出层可以采用的函数很多,从理论上说,一个函数都是可以应用的,但是如果采用Sigmoid函数的话,占用的内存要比用线性函数大的多,相对的运行的速度也要比用线性函数慢的多,而对于连续的函数的拟合,输出函数用线性函数就能很好的解决。
4试验中遇到的问题和解决方法
答:
在开始的时候把问题想得太简单,在没有加阈值的情下编出了程序,运行后才发现,结点数很多,想明白后再阈值加上使程序显得混乱。