您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > BP神经网络实现(Java代码)
BP神经网络实现(Java代码)神经网络的原理虽然理解起来不难,但是要是想实现它,还是需要做一些工作的,并且有很多细节性的东西需要注意。通过参阅各种相关资料,以及参考网络上已有的资源,自己写了一个含有一个隐含层,且只能有一个输出单元的简单的BP网络,经过测试,达到了预期的效果。需要说明的是,神经网络的每个输入都在[0,1]中,输出也在[0,1]中,在使用神经网络解决实际问题的时候,还需要对实际问题的输入输出进行归一化处理。另外,尽量不要使得神经网络的输入或输出接近于0或1,这样会影响拟合效果。我用正弦函数进行了一次测试,效果如图所示:以下是相关的代码:1.神经网络代码[java]viewplaincopy1.packagepkg1;2.3.importjava.util.Scanner;4.5./*6.*7.*/8.publicclassTestNeuro{9.10.privateintINPUT_DIM=1;11.privateintHIDDEN_DIM=20;12.privatedoubleLEARNING_RATE=0.05;13.double[][]input_hidden_weights=newdouble[INPUT_DIM][HIDDEN_DIM];14.double[]hidden_output_weights=newdouble[HIDDEN_DIM];15.double[]hidden_thresholds=newdouble[HIDDEN_DIM];16.doubleoutput_threshold;17.18.publicstaticvoidmain(String[]args){19.Scannerin=newScanner(System.in);20.TestNeuroneuro=newTestNeuro(1,5);21.neuro.initialize();22.for(inti=0;i10000;i++){23.double[]input=newdouble[1];24.input[0]=Math.random();25.doubleexpectedOutput=input[0]*input[0];26.//System.out.println(input:+input[0]+\t\texpectedOutput:+expectedOutput);27.//System.out.println(predictbeforetraining:+neuro.predict(input));28.neuro.trainOnce(input,expectedOutput);29.//System.out.println(predictaftertraining:+neuro.predict(input));30.//in.next();31.}32.while(true){33.//neuro.printLinks();34.double[]input=newdouble[1];35.input[0]=in.nextDouble();36.doubleexpectedOutput=in.nextDouble();37.System.out.println(predictbeforetraining:+neuro.predict(input));38.neuro.trainOnce(input,expectedOutput);39.System.out.println(predictaftertraining:+neuro.predict(input));40.41.}42.}43.44.publicTestNeuro(intinput_dimension,inthidden_dimension){45.this.INPUT_DIM=input_dimension;46.this.HIDDEN_DIM=hidden_dimension;47.this.initialize();48.}49.50.51./**52.*打印出本神经元网络各层之间的连接权重,以及各个神经元上的阈值的信息。53.*/54.voidprint(){55.System.out.println(隐含层阈值:);56.for(inti=0;iHIDDEN_DIM;i++){57.System.out.print(hidden_thresholds[i]+);58.}System.out.println();59.System.out.println(输出层阈值:);60.System.out.println(output_threshold);61.62.System.out.println(连接权重:*********************);63.System.out.println(输入层与隐含层的连接);64.for(inti=0;iINPUT_DIM;i++){65.for(intj=0;jHIDDEN_DIM;j++){66.System.out.print(input_hidden_weights[i][j]+);67.}System.out.println();68.}69.System.out.println(隐含层到输出层的连接);70.for(inti=0;iHIDDEN_DIM;i++){71.System.out.print(hidden_output_weights[i]+);72.}System.out.println();73.System.out.println(*********************************);74.}75.76./**77.*初始化,对所有的权值产生一个(0,1)之间的随机double型值78.*/79.voidinitialize(){80.81.//输入层到隐含层的连接权重82.for(inti=0;iINPUT_DIM;i++){83.for(intj=0;jHIDDEN_DIM;j++){84.input_hidden_weights[i][j]=Math.random();85.}86.}87.//隐含层到输出层的连接权重88.for(inti=0;iHIDDEN_DIM;i++){89.hidden_output_weights[i]=Math.random();90.}91.//隐含层的阈值92.for(inti=0;iHIDDEN_DIM;i++){93.hidden_thresholds[i]=Math.random();94.}95.//输出层的阈值96.output_threshold=Math.random();97.}98.99./**100.*激励函数101.*@paramx102.*@return103.*/104.doublefunction(doublex){105.return1/(1+Math.pow(Math.E,-x));106.}107.108./**109.*给定一个输入,进行预测110.*@paraminput111.*@return112.*/113.doublepredict(double[]input){114.double[]hiddenValues=newdouble[HIDDEN_DIM];115.for(inti=0;ihiddenValues.length;i++){116.doublesum=0;117.for(intj=0;jinput.length;j++){118.sum+=input[j]*input_hidden_weights[j][i];119.}120.sum+=hidden_thresholds[i];//再加上本神经元的阈值121.hiddenValues[i]=function(sum);122.}123.124.125.doublesum=0;126.for(inti=0;iHIDDEN_DIM;i++){127.sum+=hiddenValues[i]*hidden_output_weights[i];128.}129.sum+=output_threshold;//输出层神经元的阈值130.returnfunction(sum);131.}132.133./**134.*进行一次训练135.*@paraminput136.*@paramexpectedOutput137.*/138.voidtrainOnce(double[]input,doubleexpectedOutput){139.double[]hiddenValues=newdouble[HIDDEN_DIM];140.double[]hiddenParams=newdouble[HIDDEN_DIM];141.142.for(inti=0;ihiddenValues.length;i++){143.doublesum=0;144.for(intj=0;jinput.length;j++){145.sum+=input[j]*input_hidden_weights[j][i];146.}147.sum+=hidden_thresholds[i];//148.hiddenValues[i]=function(sum);149.hiddenParams[i]=sum;150.}151.152.doublesum=0;153.for(inti=0;iHIDDEN_DIM;i++){154.sum+=hiddenValues[i]*hidden_output_weights[i];155.}156.sum+=output_threshold;//157.doubleoutputValue=function(sum);158.doubleoutputParam=sum;159.//System.out.println(实际输出);160.161./*162.*调整权值和阈值163.*/164.165.for(inti=0;iinput.length;i++){166.doublefactor=(expectedOutput-outputValue)*outputValue*(1-outputValue)*LEARNING_RATE*input[i];167.for(intj=0;jHIDDEN_DIM;j++){168.doubledelta=factor*hidden_output_weights[j]*hiddenValues[j]*(1-hiddenValues[j]);169.//System.out.println(输入层到隐含层连接的权重调整:delta=+delta+\t\tweight=+input_hidden_weights[i][j]);170.input_hidden_weights[i][j]+=delta;171.}172.}173.doublefactor=(expectedOutput-outputValue)*outputValue*(1-outputValue)*LEARNING_RATE;174.for(inti=0;ihidden_thresholds.length;i++){175.doubledelta=factor*hidden_output_weights[i]*hiddenValues[i]*(1-hiddenValues[i]);176.hidden_thresholds[i]+=delta;177.}178.179.//System.out.println(hidden_output_weights:+hidden_output_weights.length);180.for(inti=0;ihidden_output_weights.length;i++){181.//w+=(exp-act)*df/dw182
本文标题:BP神经网络实现(Java代码)
链接地址:https://www.777doc.com/doc-2900945 .html