资源描述
BP算法实际例子与程序
1. 题目
1)
训练样本集:等间隔选取的9个样本。
检验样本集:等间隔选取的361个样本。
2)
训练样本集:等间隔选取的9个样本。
检验样本集:等间隔选取的361个样本。
3)
训练样本集1:等间隔选取的11×11个样本,应包含2个最高点。
训练样本集2:等间隔选取的21×21个样本,应包含2个最高点。。
检验样本集:等间隔选取的31×31个样本,或41×41个样本
2. BP算法原理
BP网络简介
误差反向传播算法(BP)是感知器学习规则当前著名发展,其中增加了额外的隐含层(在输入层和输出层之间,它不予外界直接相连)。网络拓扑结构被限定为前向输入:例如,由输入层向第一隐含层(或许只有一层)传输,由第一隐含层向第二隐含层传输,……,或者从最后隐含层向输出层传输,如图1所示,这是一个典型的BP神经网络结构。它包含了三层。隐含层学习对输入层信息重编码(或者说是重复表达输入层信息)。可以使用多于一层的隐含层,这时网络的功能要比单独一层隐含层时功能强大的多。可以证明,一个含有两层隐含层的神经网络可以学习任何映射。这种含两层隐含层的神经网络也就是比原来含有一层隐含层的网络稍微复杂了一些。训练BP网络的权值调整规则是感知器学习规则的发展。权值调整是通过与输出误差的比较调整实现的。
图1、BP网络结构
网络的运行包括:
1) 前向通道:计算输出层的输出结果和误差
2) 后向通道:输出误差用于调整输出单元的权值。隐含节点的误差也可以得到(通过输出层的权值将误差反向传播),这样隐含层的权值也可以调整了。
每一个数据都被前向通道和后向通道学习。这样不断重复直到误差小到一个允许的范围(或者说我们停止运行)。
BP网络最常用的工作形式是这样的:
1) 权值和阈值随机取为很小的数据
2) 输入训练采样,按下面3)—5)步运行每一采样值
3) 计算网络中每一层的输出
(i)
4) 计算训练误差
,输出层误差 (ii)
,隐含层和输入层误差 (iii)
5) 修正权值和阈值
(iv)
(v)
6) 所有采样值都完成了3)—5)步后,一次训练周期结束。计算误差情况:
7)如果满足E≦e,则结束训练。或者返回步骤2),开始下一个训练周期。
执行过程
根据BP网络规范,我们可以得到现在的BP网络算法流程图如下图2,
按照这一思路,我使用Matlab语言完成了BP神经网络程序设计。
No
Yes
参数设定
计算和保留所有层的输出
修改并保留权值和阈值
初始化权值和阈值
满足要求?
计算并保留误差
结束
Yes
训练周期
图2、BP神经网络算法流程图
BP网络的运行细节是这样的:
1、 为BP网络设定参数。如,隐含层数、神经元个数、精度等等
2、 按照随机的规则初始化权值和阈值
3、 使用等式(i)计算每层的输出
4、 按照等式(ii)或(iii)计算每层的误差
5、 通过等式(iv)和(v)重复计算权值和阈值
6、 计算同一周期内所有采样值的误差和E
7、 比较E与我们的期望值并做出判断。如果满足要求的话,或者停止运行或者返回步骤3)重复执行一个新的周期
3. 结果分析
以下结果分析中,样本学习率都取u=0.2,动量项的学习率都取n=0.05。
4.1 y=sin x
下图4.1.1—图4.1.3为不同的隐含层神经元数和不同的性能指标E所得到的曲线:
图4.1.1 隐含层神经元数为4,性能指标E=0.05
图4.1.2 隐含层神经元个数为8,性能指标E=0.05
图4.1.3 隐含层神经元数为8,性能指标E=0.01
分析:
(1)从图4.1.1和图4.1.2中可以看出,对于同样的性能指标,其训练次数会随着隐含层神经元个数的增加;比较图4.2和图4.3可以发现,对应同样数目的隐含层神经元个数,性能指标要求越高,训练次数会相应变多,甚至出现在规定的次数内(程序中最多进行20000此BP训练),性能指标不能满足要求的情况。
(2)从上述三个曲线中可以发现,总体误差会随着训练次数的增加而不断趋于0,且越到后面,变化越不明显。
(3)从样本与训练结果的误差曲线中可以发现,在样本点的附近,样本与训练结果的误差比较小;在远离样本点的区域,样本与训练结果之间的误差明显变大。
4.2 y=|sinx|
样本学习率和动量项的学习率保持不变,只需在上述程序的基础上,将函数y=sinx变换到y=|sinx|。下图4.2.1—图4.2.3为不同的隐含层神经元数和不同的性能指标E所得到的曲线:
图4.2.1隐含层神经元数为4,性能指标E=0.05
图4.2.2隐含层神经元个数为8,性能指标E=0.05
图4.2.3隐含层神经元数为8,性能指标E=0.001
图4.3.1 异或训练结果曲线
4.3
下图4.4.1—4.4.2所示为程序运行后的曲线:
图4.4.1 11*11
图4.4.2 21*21
附录1:1、2两题
clear all
close all
x0_0=linspace(0,2*pi,9);
x0=x0_0;
D=sin(x0_0);
%D=abs(sin(x0_0));
[n0,No]=size(x0);
[n2,No]=size(D);
n1=8;
u=0.2;
n=0.05;
epoch_max=20000;
erro_goal=0.001;
w1=rand(n1,n0);
w2=rand(n1,n0);
theta1=rand(n1,n0);
theta2=rand(n2,n0);
x1=0;
x2=0;
E=0;
w1_0=zeros(size(w1));
w2_0=zeros(size(w2));
theta1_0=zeros(size(theta1));
theta2_0=zeros(size(theta2));
%%%%%%%%%%%%%%%%%%%%%% training %%%%%%%%%%%%%%%%%%%%%%%%%%%
for epoch=1:1:epoch_max
for num=1:1:No
S1=w1*x0(:,num)+theta1;
x1=logsig(S1);
S2=x1'*w2+theta2;
x2=S2;
temp1=w2;
temp2=theta2;
temp3=w1;
temp4=theta1;
delta2=(D(:,num)-x2);
delta1=x1.*(1-x1).*(w2*delta2);
w2=w2+u*delta2*x1+n*(w2-w2_0);
w1=w1+u*delta1*x0(:,num)'+n*(w1-w1_0);
theta2=theta2+u*delta2+n*(theta2-theta2_0);
theta1=theta1+u*delta1+n*(theta1-theta1_0);
w2_0=temp1;
w1_0=temp3;
theta2_0=temp2;
theta1_0=temp4;
Eq=(D(:,num)-x2)'*(D(:,num)-x2)/2;
E=E+Eq;
end
Error(epoch)=E;
if(E<erro_goal)
break;
end
E=0;
end
T=linspace(0,2*pi,361);
test_in=T;
test_out=sin(T);
%test_out=abs(sin(T));
out_y=zeros(size(T));
for i=1:1:361;
S3=w1*test_in(:,i)+theta1;
x1=logsig(S3);
S4=x1'*w2+theta2;
out_y(i)=S4;
Error_out(i)= out_y(i)-sin(T(i));
end
output=out_y;
subplot(3,1,1),plot(T,test_out,'r',T,output,'b'),title('red-Ñù±¾ÇúÏߣ¬blue-ѵÁ·½á¹û');
i=1:1:epoch;
subplot(3,1,2),plot(i,Error),title('×ÜÎó²îÓëѵÁ·´ÎÊýÇúÏß');
subplot(3,1,3),plot(T,Error_out),title('Ñù±¾ÓëѵÁ·½á¹ûµÄÎó²îÇúÏß');
附录3:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%initial%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;
close all;
n0=2;
n1=4;
n2=1;
x1_i=-10:2:10;
x2_i=-10:2:10;
No=size(x1_i,2);
%when the denominator is 0, then evaluate it with a little number
for j=1:No
if(x1_i(j)==0.0)
x1_i(j)=0.001;
end
if(x2_i(j)==0.0)
x2_i(j)=0.001;
end
end
%actual outputs
for j=1:No
for i=1:No
D(No*(j-1)+i)=0.9*exp(- ( (x1_i(i)+5)^2+(x2_i(j)+5)^2 )/10)+0.99996*exp(- ( (x1_i(i)-5)^2+(x2_i(j)-5)^2 )/20);
end
end
x1=x1_i;
x2=x2_i;
for j=1:No
for i=1:No
x1_temp((j-1)*No+i)=x1(i);
end
end
for j=1:No
for i=1:No
x2_temp(i+No*(j-1))=x2(j);
end
end
X0=[x1_temp' x2_temp']'; %input matrix
w1=rand(n1,n0);
w2=rand(n2,n1);
o1=rand(n1,1);
o2=rand(n2,1);
w1_0=zeros(size(w1));
w2_0=zeros(size(w2));
o1_0=zeros(size(o1));
o2_0=zeros(size(o2));
u=0.03;
n=0.01;
E=0;
error_goal=0.1;
epoch_max=2000;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%training%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for epoch=2:1:epoch_max
for num=1:1:No*No
Si=w1*X0(:,num)+o1;
X1(:,num)=logsig(Si);
Sk=w2*X1(:,num)+o2;
X2(:,num)=Sk;
W=w2;
O=o2;
delta2=D(num)-X2(:,num);
delta1=X1(:,num).*(1-X1(:,num)).*(delta2*w2');
w2= w2 + (u*delta2)* X1(:,num)' + n*(w2- w2_0);
o2=o2+u*delta2+n*(o2-o2_0);
w2_0=W;
o2_0=O;
W = w1;
O=o1;
w1 = w1 + u*delta1*X0(:,num)'+ n* (w1 - w1_0);
o1=o1+u*delta1+n*(o1-o1_0);
w1_0 = W;
o1_0=O;
Eq = delta2*delta2/2;
E = E+Eq;
end
Error(epoch)=E;
if(E<error_goal)
break;
end
E=0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%testing%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
x1_test=-10:1:10;
x2_test=-10:1:10;
No=size(x1_test,2);
for j=1:No
if(x1_test(j)==0)
x1_test(j)=0.0001;
end
if(x2_test(j)==0)
x2_test(j)=0.0001;
end
end
Dest=0.9*exp(- ( (x1_test+5).^2+(x2_test+5).^2 )/10)+0.99996*exp(- ((x1_test-5).^2+(x2_test-5).^2 )/20);
x1_temp=x1_test;
x2_temp=x2_test;
for j=1:No
for i=1:No
x1test((j-1)*No+i)=x1_temp(i);
end
end
for j=1:No
for i=1:No
x2test(i+No*(j-1))=x1_temp(j);
end
end
X0test=[x1test' x2test']';
OUT_k=0;
for i=1:1:No*No
Si=w1*X0test(:,i)+o1;
X1test(:,i)=logsig(Si);%[4 1]
Sk=w2*X1test(:,i)+o2;
OUT_k(i) = Sk;
end
OUT=reshape(OUT_k,No,No);
OUT=OUT';
figure (1);
surf(x1_test,x2_test,Dest),title('Ñù±¾Êä³ö');
figure (2);
surf(x1_test,x2_test,OUT),title('BPѵÁ·½á¹ûÊä³ö');
i=1:epoch;
figure (3);
plot(i,Error),title('Îó²î');
展开阅读全文