BP实验报告.doc

上传人:罗晋 文档编号:6076951 上传时间:2020-09-05 格式:DOC 页数:11 大小:137KB
返回 下载 相关 举报
BP实验报告.doc_第1页
第1页 / 共11页
BP实验报告.doc_第2页
第2页 / 共11页
BP实验报告.doc_第3页
第3页 / 共11页
BP实验报告.doc_第4页
第4页 / 共11页
BP实验报告.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《BP实验报告.doc》由会员分享,可在线阅读,更多相关《BP实验报告.doc(11页珍藏版)》请在三一文库上搜索。

1、BP实验报告学生姓名 程战战 专业/班级 计算机91 学 号 09055006 所在学院 电信学院 指导教师 鲍军鹏 提交日期 2012/6/15 1 实验目的用java语言实现BP网络,解决一个简单的曲线拟合(预测)问题。要求训练数据不少于400个点,测试数据不少于100个点。在神经网络训练过程中要记录下误差,最后画出整个学习过程中的网络误差变化曲线。2 实验原理基本思想是:样本集:S=(X1,Y1),(X2,Y2),(Xs,Ys)逐一地根据样本集中的样本(Xk,Yk)计算出实际输出Ok及其误差E1,然后对各层神经元的权值W(1),W(2),W(L)各做一次调整,重复这个循环,直到Ep(所有

2、样本的误差之和)。用输出层的误差调整输出层权矩阵,并用此误差估计输出层的直接前导层的误差,再用输出层前导层误差估计更前一层的误差。如此获得所有其它各层的误差估计,并用这些估计实现对权矩阵的修改。形成将输出端表现出的误差沿着与输入信号相反的方向逐级向输入端传递的过程。基本过程是:样本:(输入向量,理想输出向量)1、权初始化:“小随机数”与饱和状态;“不同”的权值保证网络可以学。2、向前传播阶段:(1)从样本集中取一个样本(Xp,Yp),将Xp输入网络;(2)计算相应的实际输出Op:Op=FL(F2(F1(XpW(1)W(2)W(L)3、向后传播阶段误差传播阶段:(1)计算实际输出Op与相应的理想

3、输出Yp的差。(2)按极小化误差的方式调整权矩阵。(3)累计网络关于整个样本集的误差。4、如果网络误差足够小,则停止训练。否则重复第2、3步。算法伪码:样本:(输入向量,理想输出向量)1、权初始化:“小随机数”与饱和状态;“不同”的权值保证网络可以学。2、向前传播阶段:(1)从样本集中取一个样本(Xp,Yp),将Xp输入网络;(2)计算相应的实际输出Op:Op=FL(F2(F1(XpW(1)W(2)W(L)3、向后传播阶段误差传播阶段:(1)计算实际输出Op与相应的理想输出Yp的差。(2)按极小化误差的方式调整权矩阵。(3)累计网络关于整个样本集的误差。4、如果网络误差足够小,则停止训练。否则

4、重复第2、3步。本次实验采用的是三层感知器模型,如下图;其中有40个权值需要初始化,在这里,每个权值都各不相同。3 实验结果其中,纵轴代表误差,横轴代表样本的次数。可以看到,随着训练次数的增加,误差逐渐靠近x轴,逐渐减小。4 实验源代码主程序:/package BackPropagation;import java.util.Vector;public class BackPropagation double leaning_rate = 0.7;/表示学习速率double min_error = 0.0001;/足够小的误差double weight;/用于存放生成的所有权值VectorVe

5、ctor vc1,vc2,vc3;/用于存放不同层的权值double ep = new double400;/用于存放每个训练样本的误差double ep2 = new double100;/用于存放每个学习样本的误差Sample sa = new Sample();/学习样本的初始化double input = new double4;/用于存放输入层每个神经元总的输入double in_output = new double4;/用于存放输入层的输出结果double hidden_in = new double3;/用于存放隐层每个神经元总的输入double hidden_output =

6、 new double3;/用于存放隐层的输出结果double o_in = new double2;/用于存放输出层每个神经元总的输入double o_put = new double2;/用于存放输出层输出结果BackPropagation()init_weight();practice(400);study(100);public boolean isInarr(double arr,int n,double a)/判断a是否在数组arr的前n个元素中int temp = 0;for(int i=0;in;i+)if(arri = a)temp = 1;break;if(temp = 1

7、) return true;/如果在则返回trueelse return false;public void init_weight()/初始化各层神经元的权值int i,j=0,k;weight = new double30;for(i=0;i30;i+)weighti = Math.random();while(isInarr(weight,i,weighti)/使初始化的各个权值各不相同weighti = Math.random();vc1 = new VectorVector(4);/向量vc2 = new VectorVector(3);vc3 = new VectorVector(

8、2);for(i=0;i4;i+)/存放第一层的权值Vector vc11 = new Vector(3);for(k=0;k3;k+)vc11.add(weightj+);/末尾增加doublevc1.add(vc11);/增加向量for(i=0;i3;i+)/存放第二层的权值Vector vc22 = new Vector(4);for(k=0;k4;k+)vc22.add(weightj+);vc2.add(vc22);for(i=0;i2;i+)/存放第三层的权值Vector vc33 = new Vector(3);for(k=0;k3;k+)vc33.add(weightj+);v

9、c3.add(vc33);public void output(double aa)/根据输入向量aa产生最后的输出,三层的输出double x1,x2,x3;int j=0;x1 = aa0;x2 = aa1;x3 = aa2;for(j=0;j4;j+)/计算input,in_output/三个输入乘以权值的相加inputj = x1*(Vector)vc1.get(j).get(0).doubleValue()+x2*(Vector)vc1.get(j).get(1).doubleValue()+x3*(Vector)vc1.get(j).get(2).doubleValue();in_

10、outputj = 1/(1+Math.pow(Math.E, -inputj);/s形函数for(j=0;j3;j+)/计算hidden_in,hidden_outputhidden_inj = in_output0*(Vector)vc2.get(j).get(0).doubleValue()+in_output1*(Vector)vc2.get(j).get(1).doubleValue()+in_output2*(Vector)vc2.get(j).get(2).doubleValue()+in_output3*(Vector)vc2.get(j).get(3).doubleValue

11、();hidden_outputj = 1/(1+Math.pow(Math.E, -hidden_inj);for(j=0;j2;j+)o_inj = hidden_output0*(Vector)vc3.get(j).get(0).doubleValue()+hidden_output1*(Vector)vc3.get(j).get(1).doubleValue()+hidden_output2*(Vector)vc3.get(j).get(2).doubleValue();o_putj = 1/(1+Math.pow(Math.E, -o_inj);public double calcu

12、late_ep(double output1,int n)/根据第n个样本的实际输出output1计算输出误差double expect = (double) (Vector)sa.hashmap.get(n).get(1);double ep1;ep1 = (Math.pow(output10-expect0,2)+Math.pow(output11-expect1,2)/2;/7-13公式return ep1;public double adjust_outputlevel_weight(int n)/根据第n个样本来调整输出层的权值 根据7-15double output_error =

13、 new double2;/用于存放输出层每个神经元的输出误差double temp = (double )(Vector)sa.hashmap.get(n).get(1);/得到期望输出Vector vctemp = new Vector();double increment = 0.0;/表示权值的增量double weight_temp;output(double )(Vector)sa.hashmap.get(n).get(0);/得到实际输出for(int i=0;i2;i+)/对于第i个神经元vctemp = (Vector)vc3.get(i);output_errori = o

14、_puti*(1-o_puti)*(tempi-o_puti);for(int j=0;j3;j+)increment = leaning_rate*output_errori*hidden_outputj;weight_temp =(Double) vctemp.get(j).doubleValue()+increment;vctemp.add(j, weight_temp);return output_error;public double adjust_secondlevel_weight(int n)/根据第n个样本来调整隐层的权值 根据7-16 7-17int i=0,j=0;dou

15、ble output_error = new double3;/用于存放隐层每个神经元的输出误差double temp = adjust_outputlevel_weight(n);/得到输出层每个神经元的输出误差for(i=0;i3;i+)output_errori = hidden_outputi*(1-hidden_outputi)*(Double)(Vector)vc3.get(0).get(i).doubleValue()*temp0+(Double)(Vector)vc3.get(1).get(i).doubleValue()*temp1);Vector vctemp;double

16、 increment;for(i=0;i3;i+)vctemp = (Vector)vc2.get(i);for(j=0;j4;j+)increment = leaning_rate*output_errori*in_outputj;vctemp.add(j,(Double)vctemp.get(j).doubleValue()+increment);return output_error;public void adjust_firstlevle_weight(int n)/根据第n个样本来调整输入层的权值 7-16和7-17int i=0,j=0;double output_error =

17、 new double4;/用于存放输入层每个神经元的输出误差double temp = adjust_secondlevel_weight(n);/得到隐层每个神经元的输出误差for(i=0;i4;i+)output_errori = in_outputi*(1-in_outputi)*(Double)(Vector)vc2.get(0).get(i).doubleValue()*temp0+(Double)(Vector)vc2.get(1).get(i).doubleValue()*temp1+(Double)(Vector)vc2.get(2).get(i).doubleValue()

18、*temp2);Vector vctemp;double increment;double num;for(i=0;i4;i+)vctemp = (Vector)vc1.get(i);for(j=0;j3;j+)num = (double )(Vector)sa.hashmap.get(n).get(0);increment = leaning_rate*output_errori*numj;vctemp.add(j,(Double)vctemp.get(j).doubleValue()+increment);/return output_error;public void practice(

19、int n)/n表示样本数量 训练过程int i = 0;int t = 0;/临时变量,用于select_small()的返回值,表示第t个样本double sum = 1;/表示样本集误差总和int s=0;double temp =0;while(summin_error)sum = 0;for(i=0;in;i+)output(Vector)sa.hashmap.get(i).get(0);temp = calculate_ep(o_put,i);sum += temp;if(s=0)epi = temp;adjust_firstlevle_weight(i);s+;/*for(i=0

20、;i400;i+)System.out.println(epi);*/public void study(int n)/测试for(int i=0;in;i+)output(Vector)sa.hashmap2.get(i).get(0);ep2i = calculate_ep(o_put,i);System.out.println(ep2i);样本和测试程序:/package BackPropagation;import java.util.HashMap;import java.util.Map;import java.util.Vector;public class Sample Vec

21、tor z;double x,y;MapInteger,Vector hashmap;MapInteger,Vector hashmap2;Sample() x = new double3; y = new double2; z = new Vector(2); hashmap = new HashMapInteger,Vector(400);/400个训练样本 hashmap2 = new HashMapInteger,Vector(100);/100个测试样本 for(int i=0;i400;i+)/400个样本 for(int j=0;j3;j+) xj = Math.random()

22、*100; for(int k=0;k2;k+) yk = Math.random()*100; z.add(x); z.add(y); hashmap.put(i,z); for(int i=0;i100;i+) for(int j=0;j3;j+) xj = Math.random(); for(int k=0;k2;k+) yk = Math.random(); z.add(x); z.add(y); hashmap2.put(i,z); 作图程序:/package BackPropagation;import java.awt.Color;import java.awt.Frame;i

23、mport java.awt.Graphics;public class Curve extends FrameBackPropagation bp = new BackPropagation();double temp = bp.ep;public void paint(Graphics g)this.setBackground(Color.GRAY);g.setColor(Color.BLACK);for(int i=0;i100;i+)g.drawLine(i*10,(int)(tempi*10000),(i+1)*10,(int)(tempi+1*10000);/System.out.println(int)(tempi*10000);/g.drawLine(0,325,600,125);public static void main(String args) Curve curve = new Curve();curve.setSize(600,600);curve.setLocation(100,100);curve.setVisible(true);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1