智能控制实验报告-BP神经网络一.实验内容设计BP网络,映射函数为:1.y=sin(x)x∈(0,2𝜋)2.y=x1^2+x2^2+x1*x2x1,x2∈(0,1)给出训练后的权值矩阵,并考察训练拟合的效果。二.实验原理1.BP网络原理BP网络模型处理信息的基本原理是:输入信号Xi通过中间节点(隐层点)作用于输出节点,经过非线形变换,产生输出信号Yk,网络训练的每个样本包括输入向量X和期望输出量t,网络输出值Y与期望输出值t之间的偏差,通过调整输入节点与隐层节点的联接强度取值Wij和隐层节点与输出节点之间的联接强度Tjk以及阈值,使误差沿梯度方向下降,经过反复学习训练,确定与最小误差相对应的网络参数(权值和阈值),训练即告停止。此时经过训练的神经网络即能对类似样本的输入信息,自行处理输出误差最小的经过非线形转换的信息。2.BP学习的过程正向传播:输入样本---输入层---各隐层---输出层判断是否转入反向传播阶段:若输出层的实际输出与期望的输出(教师信号)不符误差反传3.BP网络的设计在本次试验中,均采用了三层的BP网络,即输入层,一隐层,输出层。隐层结点数均定义为10个。在取样本时,采取均匀采样的方法,在测试时采用未使用的数据。对于初始值采用随机选取的办法。采用单极性Sigmoid函数:f(x)=11+e−x,其具有连续、可导的特点。o1…ok…olW1○Wk○Wl○y1○y2○…○yj…○ymV1Vm○○○○○x1x2…xi…xn-1xn4.算法1)初始化网络参数,其阈值和各层之间的权值均用随机数产生,其范围[-1,1];2).输入样本及教师信号,(x,y),并归一化,其函数为:[0,1]归一化([min,max]----[0,1]):minmaxminiixxxxx[0,1]反归一化([0,1]----[min,max]):maxminmin()iixxxxx[-1,1]归一化([min,max]----[-1,1]):mimaxmin2()idixxxxx[-1,1]反归一化([-1,1]----[min,max]):maxminmi()/2iidxxxxx(其中maxminm2idxxx)3)计算隐层及输出层的输出设其函数为:f(x)=1/(1+exp(x))则隐层输出为:=(∑)输出层输出为:=(∑)4)计算各层的误差信号并改变权值。计算隐层对输出层的误差信号,δko=(dk−Ok)Ok(1−Ok),并根据误差信号求出权值增量,△Wjk=ηδkoyj。进而可更新权值:Wjk=Wjk+△Wjk。计算输入层对隐层的误差信号,δjy=(∑δkolk1Wjk)yj(1−yj),并根据误差信号,求出权值增量,△Vij=ηδjyxi。进而可更新权值:Vij=Vij+△Vij。5)计算网络均方根误差E,E=12∑∑(dkp−Okp)lk1Pp1判断误差是否达到要求或者达到训练次数,若未达到要求,则执行3,4部知道到达要求。6)若满足要求,则进行测试。f(x)1.00.5x05..算法的流程图为:初始化V、W、Emin,、ηq=1,p=1,E=0输入样本,计算各层输出:m21jfyTjj,...,,),(XVl21kfoTjk,...,,),(YW计算误差:P1pl1k2kkod21E)(计算各层误差信号:l21koo1odkkkk,...,,,))((δokm21jyy1wjjl1kjkokyj,...,,))((调整各层权值:m10jl21kjyokjkwjkw,...,,,...,,,,n10xm21jxvviyjijij,...,,,...,,,Yp增1,q增1pP?NNE=0,p=1EEminY结束调用测试函数text对得到的BP网络进行测试结束三.实验结果(1)y=sin(x)在实验时将隐层节点个数设为:10;学习率为:0.1;误差设定值为:0.00013;实验截图如图所示:实验次数及误差经试验,当误差达到0.00013后,误差减小的很慢,当达到0.00012后便开始增加。故选定误差为0.00013,训练次数为36624次。实验结束后的权值:测试:(2)y=x1^2+x2^2+x1*x2x1,x2∈(0,1)在实验时将隐层节点个数设为:10;学习率为:0.5;误差设定值为:0.0015;实验截图如图所示:实验次数及误差经试验,当误差达到0.0015后,误差减小的非常慢,但一直在减小,故选定误差为0.0015,且选定的学习率比较高。最终的训练次数为56788次。最终的权值为数据测试四.实验结果分析在BP网络训练的过程中,误差开始减小的非常快,到后来训练了一万次后误差减小开始变得非常慢。当改变学习率时,学习率增加时,学习的速度增加,但是出现了震荡的现象。选取较小的学习率时,学习的速率明显变慢,但是选取的值较多,震荡的现象减小。隐层节点数减少时学习的速率变快,但是相应的测试误差变大。在测试时,有的数的误差明显偏大,这是由于训练次数少,隐层结点数少,训练有误差而导致的仿真结果不准确造成的。五.实验中存在的不足(1)对于第一题,在训练时,产生了很多次的震荡,而且不能保证最后的结果是最优的结果。(2)对于第二题,误差减小的很慢,到了最后基本上不减小。训练次数多使得学习效率低,收敛速度慢;(3)实验训练结束后的测试,最终的绝对误差均在0.05左右,有些大。训练次数少,误差较大而引起的。六.实验中出现的问题(1)在调试程序的过程中出现误差非常大,而且不减小的情况——进入了平坦区产生的原因:没有进行归一化处理。进行归一化处理的原因:①网络的各个输入数据常常具有不同的物理意义和不同的量纲,归一化给各输入分量以同等重要的地位;②BP网的神经元均采用Sigmoid转移函数,变换后可防止因净输入的绝对值过大而使神经元输出饱和,继而使权值调整进入误差曲面的平坦区;③Sigmoid转移函数的输出在0~1或-1~1之间。教师信号如不进行归一化处理,势必使数值大的输出分量绝对误差大,数值小的输出分量绝对误差小。(2)在调试的过程中出现了误差震荡产生的原因:标准BP算法的局限性,在误差变化剧烈的区域,η太大会因调整量过大而跨过较窄的“坑凹”处,使训练出现振荡,反而使迭代次数增加。解决方法:自适应改变学习率,使其根据环境变化增大或减小。(3)误差收敛比较慢产生原因:只按t时刻误差的梯度降方向调整,而没有考虑t时刻以前的梯度方向解决方法:从前一次权值调整量中取出一部分迭加到本次权值调整量中(4)对于使用VC的错误产生的原因:由于很久没有使用C编写程序,对C的一些函数和变量定义有一些生疏,所以导致一些基本的错误。七..实验心得通过本次试验,让我对BP神经网络的基本原理和方法有了更深层次的理解,学会了如何运用VC++设计BP网络。了解了BP网络的基本算法,及标准BP算法存在的局限性有了更深的了解,并且了解了改进BP算法的方法及过程。八.附录:(1)y=sin(x)程序#includeiostream#includecmathusingnamespacestd;#definet200000#definenumInputLayer1#definenumHiddenLayer10#definenumOutputLayer1#definelearnRatio0.1#definenumSample50#definepi3.1415926//输入样本doubleX[numSample][numInputLayer];//期望输出样本doubleY[numSample][numOutputLayer];doubletheta_hide[numHiddenLayer];//隐含结点阀值doubletheta_output[numOutputLayer];//输出结点阀值doublew_hide_input[numHiddenLayer][numInputLayer];//隐含结点权值doublew_output_hide[numOutputLayer][numHiddenLayer];//输出结点权值doubleinput_x[numInputLayer];//输入样本doubleoutput_y[numOutputLayer];//期望输出样本doublenet_hide[numHiddenLayer];//隐含层状态值doubleo_hide[numHiddenLayer];//隐含层输出值doublenet_output[numOutputLayer];//输出状态值doubleo_output[numOutputLayer];//输出层输出值doubledet_w_hide_input[numHiddenLayer][numInputLayer];//新隐含结点权值doubledet_w_output_hide[numOutputLayer][numHiddenLayer];//新输出结点权值doublepreminmax(doublemin,doublemax,doublein)//归一化函数:[min,max]----[0,1]{return(in-min)/(max-min);}doublepostminmax(doublemin,doublemax,doublein)//反归一化函数:[0,1]----[min,max]{returnin*(max-min)+min;}doublepreminmax2(doublemin,doublemax,doublein)//归一化函数:[min,max]----[-1,1]{doublemid=(max+min)/2;return2*(in-mid)/((max-min));}doublepostminmax2(doublemin,doublemax,doublein)//反归一化函数:[-1,1]----[min,max]{doublemid=(max+min)/2;returnin*(max-min)/2+mid;}intData_Input(inti){X[i][0]=2*i*pi/50;Y[i][0]=sin(X[i][0]);X[i][0]=preminmax2(0,2*pi,X[i][0]);//输入[0,2π]归一化到[-1,1]Y[i][0]=preminmax(-1,1,Y[i][0]);//输出[-1,1]归一化到[0,1]return0;}voidinitial(){//隐含层阈值for(inti=0;inumHiddenLayer;i++){theta_hide[i]=(2.0*(double)rand()/RAND_MAX)-1;//-1到1之间的随机数}//输出层阈值for(i=0;inumOutputLayer;i++){theta_output[i]=(2.0*(double)rand()/RAND_MAX)-1;}//输入层与隐层之间的权值for(i=0;inumHiddenLayer;i++){for(intj=0;jnumInputLayer;j++){w_hide_input[i][j]=(2.0*(double)rand()/RAND_MAX)-1;}}//输出层与隐层之间的权值for(i=0;inumOutputLayer;i++){for(intj=0;jnumHiddenLayer;j++){w_output_hide[i][j]=(2.0*(double)rand()/RAND_MAX)-1;}}}voidcalcNet0()//输入层netk{for(inti=0;inumHiddenLayer;i++){doubletemp=0;for(intj=0;jnumInputLayer;j++){temp+=w_hide_input[i][j]*input_x[j];//Wi*Xi}net_hi