姓名: 学号:
一、课题研究主要内容
1、编写BP网络程序,进行函数测试,包括测试网络的泛化能力。实现方式:自 行编程。
2、编写BP网络程序,进行函数测试,包括测试网络的泛化能力。实现方式: MATLAB工具箱函数。
3、编写BP网络程序,进行BP网络的应用研究。
二、BP网络的基本原理
BP(Back propagation)神经网络又称为多层前馈神经网络,为三层前馈神
经网络的拓扑结构。它是当前最为广泛的一种人工神经网络,可用于语言综合、识别和自适应控制等系统。这种神经网络模型的特点是:结构简单,工作状态稳定,易于硬件实现;各层神经元仅与相邻层神经元之间有连接;各层内神经元之间无任何连接;各层神经元之间无反馈连接。输入信号先向前传播到隐结点,经过变换函数之后,把隐结点的输出信息传播到输出结点,再给出输出结果。结点的变换函数通常选取Sigmoid型函数。
BP神经网络有以下优点:
1. 只要隐含层神经元的个数足够多,则隐神经元为S型神经元而输出元为
线性的二层网可以逼近任何函数
2. BP网络的学习算法属于全局逼近的方法,因而它具有较好的泛化能力。
泛化能力也称推广能力,指经训练后的神经网络对未在训练样本集中出现(但具有统一规律)的样本作出正确反映的能力。
BP网络能够实现输入输出的非线性映射关系,但它并不依赖于模型。其输入与输出之间的关联信息分布地存储于连接权中,由于连接权的个数很多,个别神经元的损坏只对输入输出关系有较小的影响,因此BP网络有较好的容错性。
o1 … ok … ol
W1○ Wk○ Wl ○ y1○ y2○ … ○ yj … ○ym V1 Vm ○ ○ ○ ○ ○ x1 x2 … xi … xn-1 xn 基于BP算法的多层前馈网络模型
1
其中X(x1,x2,...xi,...xn1,xn)T是输入向量; Y(y1,y2,...yj,...ym)T是隐层输出向量; O(o1,...ok,...ol)T是输出层输出向量;
V(V1,V2,...Vj,...Vm)是输入层到隐层之间的权值矩阵; W(W1,W2,...Wk,...Wl)是隐层到输出层之间的权值矩阵; BP网络的学习算法如下:
P(q)(q)(q1) Dijpixpjp1 nq1(q)(q1)(q1)q)q) pi(pkwki)x(pi(1x(pi)k1
(Q)Q)Q)Q)pi(dpix(pi)x(pi(1x(pi)
qQ,Q1,,1,i1,2,,nq,j1,2,nq1
算法对应程序框图为:
开始连接权及阀值初始化学习模式对提供给网络计算中间层各单元的输入、输出计算输出层各单元的输入、输出计算输出层各单元的一般化误差计算中间层各单元的一般化误差调整中间层至输出层之间的连接权及输出层各单元的输出阀值调整输入层至中间层之间的连接权及中间层各单元的输出阀值更新学习输入模式否全部模式训练完?是更新学习次数否 (q)w(k1)w(k)Dij(k),0(q)ij(q)ij误差 三、BP网络的训练及测试 3.1 待逼近函数 y=sum(xi.^2),xi=[-10:10],i=1,2 采用一阶梯度法即最速下降法寻优,用MATLAB编程。 3.2 BP网络训练 样本训练数据采用 x=-10+20*rand([100,2]);x1=x(:,1);x2=x(:,2); y100= x1.^2+x2.^2; 即随机产生100组(x1,x2)输入数据和输出数据y100进行BP网络训练。 运行结果: Result: error_final =9.9987e-004 times =3716 程序此次运行,在训练3716次时就已经达到设置的误差精度, w12和w23是经过100组样本3712次训练后达到误差精度的输出的权值。 3.3 BP网络泛化能力测试 训练网络的目的在于寻找隐含在样本数据中的输入和输出之间的本质联系,从而对于未经训练的输入也能给出合适的输出,即局部泛化能力。而且,网络的性能只要是用它的泛化能力来衡量,它不是用对训练数据的拟合程度来衡量,而是用一组独立的数据来加以测试和检验。 w12 = 0.0042 2.6035 2.9886 -2.9748 -0.0717 -3.0267 0.5290 -0.6188 0.1943 0.2360 -2.0802 2.4535 -2.4801 0.0043 2.6763 0.9945 0.5188 -1.2393 -0.9632 -0.6220 1.6275 0.7594 -0.0516 -0.0294 -0.5150 -1.5770 -0.4124 w23 = Columns 1 through 6 3.1818 -2.4220 0.6801 4.3432 3.5941 -0.0905 Columns 7 through 10 1.3816 0.5940 -1.2700 -0.5588 y = 4.5027 1.4647 0.4823 4.4942 6.9565 3.4526 3 4.5003 6.6348 0.9576 1.1043 8.0120 7.9273 其中,y是测试数据利用刚训练好的BP网络计算产生的结果,y的测试输入不包含在100组样本中,是另外随机产生的12组(x1,x2)。之所以输出y,是想利用测试输入的正确输出值与之对比,测试输入的输出直接用函数计算,见附录代码2。 采用指令: yyy=yy-y; i=(1:12); h=figure; plot(i,yyy,'*-r'); title('测试结果误差'); xlabel('测试样本'); ylabel('error'); 得到运行结果如下: yy = 4.7396 1.5295 0.4583 4.7150 6.8771 3.7589 4.7539 6.6038 1.0813 1.2137 8.3886 8.3886 测试结果和图像表明:训练后的BP网络能较好地逼近函数。 四、作业总结 1、本次作业简单地进行了BP网络的训练和泛化能力的测试,参数调整和算法优化改进都未能进行,还可以继续深入学习。 2、算法不是很稳定,每次运行不能较好的逼近最优解且精度不是太高。 4 参考文献 1、蒋宗礼.人工神经网络导论.北京:高等教育出版社.2001 2、刘会灯、朱飞.MATLAB编程基础与典型应用.人民邮电出版社.2008 3、李玉榕.人工智能第四章人工神经网络.福州大学.2010 5 %-----------------------------代码1 %基本最速梯度下降法 %建立一个3层(含输入层)的BP神经网络,并对其进行训练 %输入层不进行数据处理,隐含层激活函数为sigmod函数,输出层为线性函数 %输入输出数据归一化到[-1,1],数据在矩阵中按行向量表示 %即x=[x11,x12;x21,x22;...;xp1,xp2] y=[y1;y2;...;yp] p为样本数 clc %---------------------------------------参数说明 n1=2; %输入层神经元数(输入变量个数) n2=9; %隐含层神经元数 n3=1; %输出层神经元数(输出变量个数) ls=0.1; %学习速度 goal=1e-3; %误差要求(误差平方和) train_num=5000; %最大训练轮回数 %--------------------临时变量 y3t=zeros(n3,1); %输出层神经元输出 y2t=zeros(n2,1); %隐含层神经元输出 dw23=zeros(n3,n2+1); %权值修正量 dw12=zeros(n2,n1+1); %----------------------------------------相关数据 sample_num=100; %训练样本数 样本输入变量为x1,x2 为[-2.5,2.5] 随机生成的数 xs=[-9.7027 7.9040 -4.2361 8.8477 6.3346 -3.2983 9.7097 -1.2527 -9.6527 -0.5769 6.3879 -7.0138 2.4228 -7.2827 1.2044 0.6500 -5.1194 4.5158 6.4402 -2.0259 -4.7358 -2.8316 5.0727 -4.2944 3.1929 7.3727 -5.7187 2.5283 2.0423 -5.1766 2.0987 9.5616 3.1900 2.8100 -6.3327 -5.4030 2.7309 3.6267 -6.5938 3.3165 6 0.7920 -7.3056 2.4679 -9.5501 3.7178 -4.7560 3.5469 -7.6697 7.5366 -8.6136 -9.7422 7.0586 -3.7920 -6.3934 5.5816 -9.3516 -3.8541 4.6785 8.5336 0.7303 3.5744 -4.4794 -8.5136 -2.6308 -8.5866 -9.7423 -9.7614 7.7841 -5.4569 7.3204 0.3250 -4.9151 -0.8359 1.3896 4.0641 -6.8147 1.6497 1.8873 0.1841 -3.3780 -8.5142 3.1723 -6.1353 7.2727 -2.4079 1.3525 -4.4713 9.6096 5.4176 5.8366 -3.7214 -6.9481 2.7639 6.6605 9.7313 -6.1627 0.0575 2.7797 8.9541 3.3800 6.5605 5.4418 8.3511 -2.4036 -7.7384 -1.1683 6.2425 -0.3388 8.1653 2.1621 -6.8725 -6.4801 -7.5576 -9.9595 5.2533 5.8045 4.4360 0.2722 3.0328 -5.7354 5.0805 -7.9310 3.2632 -6.8533 7.6699 -1.8497 -4.5569 -1.8449 7 -1.6113 -8.9461 -5.7401 8.8363 -9.2880 -7.0006 -8.3767 -2.3125 7.0113 -3.7788 -3.1959 -6.6293 -0.6769 7.9330 8.2753 -3.5455 -5.4285 4.6799 7.2409 -1.7819 3.1324 -2.0041 7.8237 0.1104 -0.2371 -6.6139 9.8529 0.4949 -2.5335 2.8241 0.6276 -9.6761 -6.3737 6.7370 0.0389 6.0692 -1.5561 3.9557 3.2085 -0.7622 3.4731 -8.3477 9.1466 6.4143 -6.1627 -6.1396 -7.7757 -1.0929 1.3011 -9.7408 9.3833 -3.8252 -9.5251 7.5070 7.4043 6.7052 -9.4625 -3.3381 0.3906 7.6141 -6.1542 -0.4063 4.3138 1.2163 -4.9865 2.3182 8.6773 3.2380 -7.2562 2.3327 0.4324 3.7028]'; %ys=[156.6164 96.2274 51.0065 95.8470 93.5083 89.9980 58.9077 1.8731 注意矩阵转至,变为列向量形式,便于后续处理8 46.6003 45.5800 30.4456 44.1742 64.5514 39.0961 30.9679 95.8295 18.0725 69.2961 20.6110 54.4774 53.9997 97.2955 36.4417 71.4049 130.9951 144.7342 55.2543 118.6071 36.7425 73.3551 32.8414 79.4022 168.6419 155.8773 83.3665 24.2635 2.6298 62.9568 6.2833 11.4448 82.5549 90.5335 7.6272 112.3375 63.4171 62.1253 52.0018 132.6782 7.7302 91.5997 72.6531 75.5191 9 61.2478 39.0838 71.3461 89.2225 156.3091 61.2895 19.7522 42.0928 88.7118 57.6160 62.2483 24.1684 82.6300 111.0293 135.2749 75.5173 63.4384 54.1617 63.3901 81.0507 51.3700 55.6058 13.8283 61.2218 43.7997 97.3248 14.3938 94.0198 86.0113 36.8372 18.0690 10.8758 81.7470 124.8041 75.6734 61.6555 96.5768 102.6787 147.0833 99.7834 100.6812 58.1272 38.0389 20.0882 10 30.2396 85.7800 58.0940 13.8977]'; %----------------测试样本 test_num=12; %测试样本数 x=[0.121478591 -2.17366709 -0.955558754 0.785085267 -0.184518117 0.651315673 -1.837057781 1.157659622 1.305222204 2.27453752 -1.825393635 -0.653361852 -0.344337145 -2.15298544 1.796375058 1.837619295 -0.165094011 -1.026679913 -1.068856458 0.266873738 2.048 -2.048 -2.048 -2.048]'; %------------------数据归一化为[-1,1] [xsn,xmin,xmax,ysn,ymin,ymax]=premnmx(xs,ys);%训练样本归一化 [xn]=tramnmx(x,xmin,xmax); %测试样本归一化 %====================================================主函数 %---------------------------------------网络建立与初始化 %权值阈值初始化为 [-2.4/Fi,2.4/Fi]。 Fi为第i个神经元总输入 w12=-2.4/n1+4.8/n1*rand(n2,n1+1);%输入层到隐含层连接权矩阵,将阈值也作为一个连接权 w23=-2.4/n2+4.8/n2*rand(n3,n2+1);%隐含层到输出层连接权矩阵 %/////////////////////////////////////////////////////////训练过程 for times=1:train_num %times为实际训练的次数 for t=1:sample_num %第t次迭代 %---------正向计算过程 s2=w12*[xsn(:,t);-1]; %隐含层净输入 y2t=(1+exp(-s2)).^-1; %隐含层输出 y3t=w23*[y2t;-1]; %输出层输出 %---------------------------反向计算过程 %------------输出层 ke3=ysn(:,t)-y3t; %输出层误差斜率,输出为线性函数 dw23=ls*ke3*[y2t;-1]'; %隐含层到输出层权值修正量 w23=w23+dw23; %权值更新 %-----------隐含层 11 for j=1:n2 %隐含层误差斜率计算 ke2t=0; for k=1:n3 ke2t=ke2t+ke3(k)*w23(k,j); end ke2(j)=y2t(j)*(1-y2t(j))*ke2t; %隐含层第j个神经元误差斜率 for i=1:n1 dw12(j,i)=ls*xsn(i,t)*ke2(j); %隐含层到输出层权值修正量 w12(j,i)=w12(j,i)+dw12(j,i); %权值更新 end dw12(j,n1+1)=ls*(-1)*ke2(j); w12(j,n1+1)=w12(j,n1+1)+dw12(j,n1+1); end end %-------------------完成一次训练,计算误差 error(times)=0; %error误差的平方和 for t=1:sample_num s2=w12*[xsn(:,t);-1]; %隐含层净输入 y2t=(1+exp(-s2)).^-1; %隐含层输出 y3t=w23*[y2t;-1]; %输出层输出 dyn=ysn(:,t)-y3t; error(times)=error(times)+0.5*(dyn)'*dyn; end if error(times)<=goal %达到误差要求,训练结束 break; end end %--------------------------训练结束,显示误差曲线 p=1:times; semilogy(p,error(p)) %显示误差曲线 title('标准最速下降法'); xlabel('train times'); ylabel('error'); %显示相关训练结果 error_final=error(times) %最终误差 times %最终训练次数 w12=w12 %训练后的权重矩阵 w23=w23 %---------------------------网络测试 for t=1:test_num s2=w12*[xn(:,t);-1]; %隐含层净输入 y2=(1+exp(-s2)).^-1; %隐含层输出 y3(:,t)=w23*[y2;-1]; %输出层输出 12 end y=postmnmx(y3,ymin,ymax); %反归一化,显示结果 y=y' %--------------------------------代码2 x=[0.121478591 -2.17366709 -0.955558754 0.785085267 -0.184518117 0.651315673 -1.837057781 1.157659622 1.305222204 2.27453752 -1.825393635 -0.653361852 -0.344337145 -2.15298544 1.796375058 1.837619295 -0.165094011 -1.026679913 -1.068856458 0.266873738 2.048 -2.048 -2.048 -2.048]; x1=x(:,1); x2=x(:,2); yy=x1.^2+x2.^2 13 因篇幅问题不能全部显示,请点此查看更多更全内容