1、BP神经网络实例智能控制1第一章 BP神经网络基本原理一、BP神经网络基本概念1、人工神经网络人工神经网络ANN(Artificial Neural Network),是对人类大脑系统的一阶特性的一种描述。简单地讲,它是一个数学模型,可以用电子线路来实现,也可以用计算机程序来模拟,是人工智能研究地一种方法。近年来发展迅速并逐渐成熟的一种人工智能技术,其来源于对神经元细胞的模拟。人工神经网络具有以下三个特点:信息分布表示,运算全局并行与局部操作,信息非线性处理。由于这三个特点,使得由人工神经网络构成的分类器具有强大的数据拟和与泛化能力,因而广泛运用于模式识别与机器学习领域。神经网络模式识别的过程
2、分为两步:首先是学习过程,通过大量的训练样本,对网络进行训练,根据某种学习规则不断对连接权值进行调节,然后使网络具有某种期望的输出,这种输出就可以将训练样本正确分类到其所属类别中去,此时可以认为网络是学习到了输入数据或样本间的内在规律。接下来是分类过程,应用前面学习过程所训练好的权值,对任意送入网络的样本进行分类。人工神经网络模型各种各样,目前已有数十种。他们从各个角度对生物神经系统的不同层次进行了描述和模拟。代表模型有感知机、多层映射BP网、RBF 网络、HoPfiled模型、Boit机等等。虽然人工神经网络有很多模型,但按神经元的连接方式只有两种型态:没有反馈的前向网络和相互结合型网络。前
3、向网络是多层映射网络,每一层中的神经元只接受来自前一层神经元的信号,因此信号的传播是单方向的。BP网络是这类网络中最典型的例子。在相互结合型网络中,任意两个神经元都可能有连接,因此输入信号要在网络中往返传递,从某一初态开始,经过若干变化,渐渐趋于某一稳定状态或进入周期震荡等其它状态,这方面典型的网络有Hopfiled模型等。智能控制22、BP神经网络BP算法是利用输出层的误差来估计输出层的直接前导层的误差,再用这个误差估计更前一层的误差。如此下去,就获得了所有其他各层的误差估计。这样就形成了将输出端表现出的误差沿着与输入信号传送相反的方向逐级向网络的输入端传递的过程。因此,人们就又将此算法称为
4、向后传播算法,简称BP算法。如下图所示:算法过程为(1)设置各权值和阈值的初始值 , 为小随机数。()0ljiw()0,1.)lj L(2)输入训练样本 ,对每个样本进行(3)(5)步。,qId(3)计算各个网络层的实际输出 ()()()1)()llllxfsfwx(4)计算训练误差 ,输出层()()()l lljqjjjdxfs,隐含层和输入层1()()()(1)lnl lljj kjkfsw智能控制3(5)修正权值和阈值 (1)()()1()()1l lllljijijijijiwkkxwk ()()()()()llllljjjjj(6)当样本集中的所有样本都经历了(3)(5)步后,即完成
5、了 一个训练周期(Epoch),计算性能指标 ,其中 。1E=Qq212mqqjjjdx(7)如果性能指标满足精度要求,即 ,那么训练结束,否则,转到(2),继续下一个训练周期。 是小的正数,根据实际情况而定,例如0.013、流程图根据BP网络的算法,我们可得流程图如下。否Yes参数设置计算并保存各网络层的输出修正并保存权值和阈值s初始化权值和阈值是否满足精度计算并保存传递误差结论是训练周期数智能控制40 1 2 3 4 5 6 7-1-0.8-0.6-0.4-0.200.20.40.60.81 习习习习xy=cos(x)第二章 BP神经网络实例分析一、实例要求1、 ()cos,(02)fxx
6、取九个点来训练网络,然后得出拟合曲线。2、 ()sin,()fxx取适当数量训练点来训练网络,然后得出拟合曲线3、 si,;,(10,)yfxyx取11*11个点来训练网络,并用21*21个点测试拟合的曲面。二、计算结果如下1、第一个函数: 1()cos,(02)fxx(2)学习率为0.2,训练次数为3300时训练过程如学习曲线所示,圈圈为学习后产生的,折线为标准函数点连线。检验过程如检验曲线所示,点序列为拟合曲线上的点,曲线为标准函数曲线。误0 1 2 3 4 5 6 7-1-0.8-0.6-0.4-0.200.20.40.60.81 习习习习xy=cos(x)0 200 400 600 8
7、00 1000 1200 140000.511.522.53 习习习习习习习习习习习智能控制5差曲线如右图所示。(2)学习率为0.01,训练次数为3300时的曲线。从函数1可以看出,学习率比较大时,曲线收敛比较快,可以比较快速达到精度要求。但实际上,学习率比较大时(即收敛步长比较大),容易超出收敛边界,反而收敛导致不稳定,甚至发散。2、第二个函数: 2()sin,(02)fxx(1)学习率为0.2,样本点数为10,学习次数为5000时的曲线如下:0 1 2 3 4 5 6 7-1-0.500.511.5 习习习习xy=cos(x)0 1 2 3 4 5 6 7-1-0.500.511.5 习习
8、习习xy=cos(x)0 500 1000 1500 2000 2500 3000 350000.511.522.533.54 习习习习习习习习习习习0 1 2 3 4 5 6 700.20.40.60.811.21.4 习习习习xy=cos(x)0 1 2 3 4 5 6 700.20.40.60.811.21.4 习习习习xy=cos(x)智能控制6(2)学习率为0.2,样本点数为30,学习次数为5000时的曲线如下:从函数2可以看出,样本点个数越多时,曲线精度越高。但学习时间会有所增加。0 500 1000 1500 2000 2500 3000 3500 4000 4500 50000
9、.40.50.60.70.80.911.1 习习习习习习习习习习习0 1 2 3 4 5 6 7-0.200.20.40.60.811.2 习习习习xy=cos(x)0 1 2 3 4 5 6 7-0.200.20.40.60.811.2 习习习习xy=cos(x)0 500 1000 1500 2000 2500 3000 3500 4000 4500 500000.20.40.60.811.21.4 习习习习习习习习习习习智能控制73、第三个函数 3sin,;,(10,)xyfy学习率为0.1,动量项学习率为0.05,训练次数为5000,训练样本数为11*11。图形如下:051015051
10、015-0.500.511.5习习习习习习智能控制8051015051015-0.500.51习习习习习习0 102001020-101习 习 习 习 习 习0 102001020-202习 习 习 习 习 习0 500 1000 1500 2000 2500 3000 3500 4000 4500 50000510 习 习 习 习智能控制9附:程序源代码第一个和第二个函数的程序:%此BP网络为两层隐含层,每个隐含层4个节点。输入输出各一层%输入层和输出层均采用恒等函数,隐含层采用S形函数clear all;close all;b=0.01; %精度要求a=0.2; %学习率c=2;Num=3
11、0; %训练样本数N=3300; %训练次数Nj=80; %检验样本数o0=rand(2,1); %输入层阈值o1=rand(4,1); %第一层隐含层阈值o2=rand(4,1); %第二层隐含层阈值o3=rand(1,1); %输出层阈值w1=rand(4,2); %输入信号为两个w2=rand(4,4); %第一层隐含层与第二层隐含层的权系数w3=rand(1,4); %第二层隐含层与输出层的权系数syms x y; %符号变量,用于两个输入值智能控制10%fcn=cos(x); %被学习的函数fcn=abs(sin(x);x0=0:2*pi/(Num-1):2*pi; %输入的训练样本
12、y0=0:2*pi/(Num-1):2*pi;x=x0;y=y0;X(1,:)=x0;X(2,:)=y0;yf=eval(fcn); %输出的训练样本x3=zeros(1,Num);time=0;for j=1:1:Nfor i=1:1:Num%前向计算:s1=w1*X(:,i)-o1;x1=1./(1+exp(-s1); %第一层隐含层输出s2=w2*x1-o2;x2=1./(1+exp(-s2); %第二层隐含层输出s3=w3*x2-o3;%x3=1./(1+exp(-s3); %输出层输出x3(i)=s3;%反向计算:%e3=(yf(i)-x3)./(exp(s3)+2+exp(-s3)
13、; %输出层误差e3=yf(i)-x3(i);e2=(w3)*e3)./(exp(s2)+2+exp(-s2); %第二层隐含层误差e1=(w2)*e2)./(exp(s1)+2+exp(-s1); %第一层隐含层误差%权值和阈值修正w3=w3+a*e3*(x2); %权值修正w2=w2+a*e2*(x1);w1=w1+a*e1*(X(:,i);o3=o3-a*e3; %阈值修正o2=o2-a*e2;o1=o1-a*e1;endE(j)=0.5*(yf-x3)*(yf-x3); %方差time=time+1; %记录学习次数if E(j)bbreak智能控制11endend%检验m=0:2*p
14、i/(Nj-1):2*pi;n=0:2*pi/(Nj-1):2*pi;x=m;y=n;ym=eval(fcn); %期望输出M(1,:)=x;M(2,:)=y;m3=zeros(1,Nj);for i=1:1:NjS1=w1*M(:,i)-o1;m1=1./(1+exp(-S1); %第一层隐含层输出S2=w2*m1-o2;m2=1./(1+exp(-S2); %第二层隐含层输出S3=w3*m2-o3;%m3(i)=1./(1+exp(-S3); %输出层输出m3(i)=S3;endfigure(1);plot(m,ym,g-);hold onplot(m,m3,r.); title(检验曲线
15、) ; xlabel(x);ylabel(y=cos(x) );figure(2);plot(x0,yf,b-);hold onplot(x0,x3,ro); title(学习曲线) ; xlabel(x);ylabel(y=cos(x);k=1:time;figure(3);plot(k,E); title(误差曲线) ;xlabel(训练次数);ylabel(误差值);第三个函数的程序%此BP网络为两层隐含层,每个隐含层10个节点。输入输出各一层%输入层和输出层均采用恒等函数,隐含层采用S形函数智能控制12clear all;close all;b=0.05; %精度要求a=0.1; %学
16、习率c=0.05; %动量项学习率Num=11; %训练样本数N=5000; %训练次数Nj=21; %检验样本数o0=rand(2,1); %输入层阈值o1=rand(10,1); %第一层隐含层阈值o2=rand(10,1); %第二层隐含层阈值o3=rand(1,1); %输出层阈值w1=rand(10,2); %输入层与第一层隐含层的权系数w2=rand(10,10); %第一层隐含层与第二层隐含层的权系数w3=rand(1,10); %第二层隐含层与输出层的权系数o1_before=zeros(4,1); %用于存储前一次的阈值o2_before=zeros(4,1);o3_befo
17、re=zeros(1,1);w1_before=zeros(4,2); %用于存储前一次的权值w2_before=zeros(4,4);w3_before=zeros(1,4);o1_next=zeros(4,1); %用于存储后一次的阈值o2_next=zeros(4,1);o3_next=zeros(1,1);w1_next=zeros(4,2); %用于存储后一次的权值w2_next=zeros(4,4);w3_next=zeros(1,4);x0,y0=meshgrid(-10:20/(Num-1)-0.001:10); %输入的训练样本yf=(sin(x0).*sin(y0)./(x
18、0.*y0); %被学习的函数x3=zeros(Num,Num);time=0;E=zeros(1,N);for j=1:1:Nfor i=1:1:Numfor h=1:1:NumX=zeros(2,1);X(1,:)=x0(i,h);X(2,:)=y0(i,h);智能控制13%前向计算:s1=w1*X-o1;x1=1./(1+exp(-s1); %第一层隐含层输出s2=w2*x1-o2;x2=1./(1+exp(-s2); %第二层隐含层输出s3=w3*x2-o3;%x3=1./(1+exp(-s3); %输出层输出x3(i,h)=s3;%反向计算:%e3=(yf(i)-x3)./(exp(
19、s3)+2+exp(-s3); %输出层误差e3=yf(i)-x3(i);e2=(w3)*e3)./(exp(s2)+2+exp(-s2); %第二层隐含层误差e1=(w2)*e2)./(exp(s1)+2+exp(-s1); %第一层隐含层误差w3_next=w3+a*e3*(x2)+c*(w3-w3_before); %权值修正w2_next=w2+a*e2*(x1)+c*(w2-w2_before);w1_next=w1+a*e1*X+c*(w1-w1_before);o3_next=o3-a*e3+c*(o3-o3_before); %阈值修正o2_next=o2-a*e2+c*(o2
20、-o2_before);o1_next=o1-a*e1+c*(o1-o1_before);w1_before=w1;w2_before=w2;w3_before=w3;o1_before=o1;o2_before=o2;o3_before=o3;w1=w1_next;w2=w2_next;w3=w3_next;o1=o1_next;o2=o2_next;o3=o3_next;d=yf(i,h);y=x3(i,h);E(j)=E(j)+0.5*(d-y)2); %方差endendtime=time+1; %记录学习次数if E(j)bbreakendend%检验m,n=meshgrid(-10:
21、(20/(Nj-1)-0.001):10);ym=(sin(m).*sin(n)./(m.*n);m3=zeros(Nj,Nj);for i=1:1:Nj智能控制14for j=1:1:NjM=zeros(2,1);M(1,:)=m(i,j);M(2,:)=n(i,j);S1=w1*M-o1;m1=1./(1+exp(-S1); %第一层隐含层输出S2=w2*m1-o2;m2=1./(1+exp(-S2); %第二层隐含层输出S3=w3*m2-o3;m3(i,j)=S3; %输出层输出endendfigure(1);surf(x0,y0,yf);title(学习期望输出);grid on;figure(2);surf(x0,y0,x3);title(学习实际输出);grid on;figure(3);subplot(221);surf(m,n,ym);title(检验期望输出);grid on;subplot(222);surf(m,n,m3);title(检验实际输出);grid on;k=1:time;subplot(212);title(误差曲线);plot(k,E);