神经网络实验报告BP网络实现对Hermit函数逼近.docx
《神经网络实验报告BP网络实现对Hermit函数逼近.docx》由会员分享,可在线阅读,更多相关《神经网络实验报告BP网络实现对Hermit函数逼近.docx(17页珍藏版)》请在冰豆网上搜索。
神经网络实验报告BP网络实现对Hermit函数逼近
实验报告
——基于BP网络的多层感知器
电气工程及其自动化四班
20080240402曹建
20080240406邓宏
一、神经网络结构图
O
输出层
W
隐层
Y0V
输入层
X0X
二、程序
1.单样本程序:
functionmain()
clc
closeall
p=1;Pmax=100;
q=1;Qmax=30000;
n=0.005;l=5;
Emin=0.1;
Erme=[];
rand('state',sum(100*clock));
w=rand(1,l);w0=0.5;
v=rand(1,l);v0=rand(1,l);
y0=-1;x0=-1;
forp=1:
Pmax
interrupt(p)=normrnd(0,0.1);
x(p)=8*(rand()-0.5);
d(p)=1.1*(1-x(p)+2*x(p)^2)*exp((-x(p)^2)/2);
end
while(q<=Qmax)
forp=1:
Pmax
y(p,:
)=logsig(v*x(p)+v0*x0);
o1(p)=w*y(p,:
)'+y0*w0;
o(p)=o1(p)+interrupt(p);
ek=d(p)-o(p);
fori=1:
l
ej(i)=w(i)*(d(p)-o(p))*y(p,i)*(1-y(p,i));
end
wc=n*ek*y(p,:
);w0c=n*ek*y0;vc=n*ej*x(p);v0c=n*ej*x0;
w=w+wc;w0=w0+w0c;v=v+vc;v0=v0+v0c;
E(p)=d(p)-o(p);
end
s2=0;
forp=1:
Pmax
s2=E(p)^2+s2;
end
e=(s2/Pmax)^0.5;
Erme=[Ermee];
ife<=Emin
break;
end
q=q+1;
end
Erme;
q
x=linspace(-4,4);
forp=1:
100
d(p)=1.1*(1-x(p)+2*x(p)^2)*exp((-x(p)^2)/2);
end
forp=1:
100
y(p,:
)=logsig(v*x(p)+v0*x0);
o1(p)=w*y(p,:
)'+y0*w0;
end
plot(Erme);
xlabel('误差的收敛曲线')
figure;
plot(x,d,'-r');
holdon;
plot(x,o1,'-.b');
xlabel('Hermit多项式曲线与所构建BP网络输出曲线')
最好的一次运行结果:
学习率=0.01,隐节点数=5
q=
2500
2.批处理程序:
functionmain()
clc
closeall
samnum=100;
testsamnum=101;
hiddenunitnum=5;
indim=1;outdim=1;
rand('state',sum(100*clock))
noisevar=0.1;
noise=noisevar*randn(1,samnum);
samin=8*rand(1,samnum)-4;
samoutnonoise=1.1*(1-samin+2*samin.^2).*exp(-samin.^2/2);
samout=samoutnonoise+noise;
testsamin=-4:
0.08:
4;
testsamout=1.1*(1-testsamin+2*testsamin.^2).*exp(-testsamin.^2/2);
figure
holdon
grid
plot(testsamin,testsamout,'k--')
xlabel('inputx');ylabel('outputy');
maxepochs=30000;
lr=0.003;alpha=0.5;
e0=0.1;
w1=0.1*rand(hiddenunitnum,indim);
b1=0.1*rand(hiddenunitnum,1);
w2=0.1*rand(outdim,hiddenunitnum);
b2=0.1*rand(outdim,1);
w1ex=[w1b1];
w2ex=[w2b2];
dw1ex=zeros(hiddenunitnum,2);
dw2ex=zeros(1,hiddenunitnum+1);
saminex=[samin'ones(samnum,1)]';
errhistory=[];
fori=1:
maxepochs
hiddenout=logsig(w1ex*saminex);
hiddenoutex=[hiddenout'ones(samnum,1)]';
networkout=w2ex*hiddenoutex;
error=samout-networkout;
sse=(sumsqr(error)/samnum)^0.5;
errhistory=[errhistorysse];
ifssebreak;
end
delta2=error;
delta1=w2'*delta2.*hiddenout.*(1-hiddenout);
dw2ex=lr*delta2*hiddenoutex';
dw1ex=lr*delta1*saminex';
w1ex=w1ex+dw1ex;
w2ex=w2ex+dw2ex;
w2=w2ex(:
1:
hiddenunitnum);
end
i
w1=w1ex(:
1)
b1=w1ex(:
2)
w2
b2=w2ex(:
1+hiddenunitnum)
sse
testhiddenout=logsig(w1*testsamin+repmat(b1,1,testsamnum));
testnnout=w2*testhiddenout+repmat(b2,1,testsamnum);
plot(testsamin,testnnout);
figure
holdon
grid
[xx,num]=size(errhistory);
plot(1:
num,errhistory);
运行结果最好时,学习效率=0.005,隐节点数=5:
w1=
0.5816
2.5220
-3.9213
-1.8311
-1.4301
b1=
0.7763
5.0958
-1.9469
3.9640
0.8285
w2=
0.14202.97872.94582.5186-2.2577
b2=
-3.2267
sse=
0.1000
i=
2907
3.加入动量项的批处理程序:
只需将批处理程序中的
dw2ex=lr*delta2*hiddenoutex';
dw1ex=lr*delta1*saminex';
改为
dw2ex=lr*delta2*hiddenoutex'+dw2ex*alpha;
dw1ex=lr*delta1*saminex'+dw1ex*alpha;
运行结果最好时,学习效率=0.005,隐节点数=7:
w1=
1.2224
0.2118
2.2169
-2.4819
-1.1339
-2.8364
1.6276
b1=
0.1389
-0.4904
-4.4112
-5.1026
-0.3769
-1.1383
-1.0608
w2=
1.8665-1.1976-2.7362-2.7258-1.89905.19421.9903
b2=
-0.3951
i=
5227
sse=
0.1000
表格1.单样本BP算法平均最小误差
学习效率
隐节点数
0.0001
0.001
0.003
0.005
0.01
0.1
3
0.3187
0.1600
0.1240
0.1140
0.1177
0.1305
5
0.3282
0.1020
0.1030
0.1
0.1
0.1100
7
0.2900
0.1060
0.1
0.1043
0.1
0.1
10
0.3000
0.1
0.1020
0.1075
0.1
0.101
表格2.批处理BP算法平均最小误差
学习效率
隐节点数
0.0001
0.001
0.003
0.005
0.01
0.1
3
0.4023
0.1956
0.1200
0.1436
0.1489
NaN
5
0.4302
0.1024
0.1
0.1
0.4985
NaN
7
0.4752
0.1201
0.1
0.1
0.4714
NaN
10
0.4357
0.1073
0.1010
0.1
0.5642
NaN
表格3.加入动量项的批处理BP算法平均最小误差
学习效率
隐节点数
0.0001
0.001
0.003
0.005
0.01
0.1
3
0.2845
0.1289
0.1162
0.1165
0.1452
NaN
5
0.1899
0.1
0.1
0.1
0.1053
NaN
7
0.2984
0.1
0.1
0.1
0.1002
NaN
10
0.2235
0.1
0.1
0.1082
0.1023
NaN
三.问题回答
1.比较单样本训练和批处理训练的区别;
答:
单样本输入是每输入一个样本就调整一次权值,并计算误差的大小,而对于批处理来说,是等所有的样本都输入以后再调整权值.当样本较多的时候批处理能获得较快的收敛速度.
2.根据结果分析增加动量项后算法的变化
答:
加入动量项后,就等于让权值的收敛方向向着一定的方向进行,由输出的数据可以看出这一点,对于相同的结点数,相同的学习率,加入动量项后,收速度即迭代次数明显的降低.
2改变不同参数的BP网络运行情况及结果,并给予相应的结果分析
答:
改变不同参数,对网络运行情况的影响,可以概括为:
总误差的值有一定的随机性.对于改变网络的学习率,小的学习率会使收敛更稳定一点,但是速度也会相对地慢一点,大的学习率在一定程度上能加快收敛的速度,但是收敛的概率要小得多,很容易发散,所以说,随着学习的增大,迭代的次数会先减小后增大。
大到一定程度进,由于波动太大。
结果就不在收敛.
3思考:
输出层可以采用Sigmoid函数吗?
为什么?
答:
可以,但需要进行变换。
4试验中遇到的问题和解决方法
答:
一开始不理解隐层,没有考虑隐节点个数的变化;后来还不行,因为没加阈值;后来还有很多错,比如矩阵的点乘,初始化···最后终于还是被我搞定哈!