版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、BP神经网络实现(Java代码)神经网络的原理虽然理解起来不难,但是要是想实现它,还是需要做一些工作的,并且有很多细节性的东西需要注意。通过参阅各种相关资料,以及参考网络上已有的资源,自己写了一个含有一个隐含层,且只能有一个输出单元的简单的BP网络,经过测试,达到了预期的效果。需要说明的是,神经网络的每个输入都在0,1中,输出也在0,1中,在使用神经网络解决实际问题的时候,还需要对实际问题的输入输出进行归一化处理。另外,尽量不要使得神经网络的输入或输出接近于0或1,这样会影响拟合效果。我用正弦函数进行了一次测试,效果如图所示:以下是相关的代码:1.神经网络代码javaview plaincop
2、y1. packagepkg1;2. 3. importjava.util.Scanner;4. 5. /*6. *7. */8. publicclassTestNeuro9. 10. privateintINPUT_DIM=1;11. privateintHIDDEN_DIM=20;12. privatedoubleLEARNING_RATE=0.05;13. doubleinput_hidden_weights=newdoubleINPUT_DIMHIDDEN_DIM;14. doublehidden_output_weights=newdoubleHIDDEN_DIM;15. doubl
3、ehidden_thresholds=newdoubleHIDDEN_DIM;16. doubleoutput_threshold;17. 18. publicstaticvoidmain(Stringargs)19. Scannerin=newScanner(System.in);20. TestNeuroneuro=newTestNeuro(1,5);21. neuro.initialize();22. for(inti=0;i10000;i+)23. doubleinput=newdouble1;24. input0=Math.random();25. doubleexpectedOut
4、put=input0*input0;26. /System.out.println(input:+input0+ttexpectedOutput:+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
5、)33. /neuro.printLinks();34. doubleinput=newdouble1;35. input0=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. 4
6、1. 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;
7、i+)57. System.out.print(hidden_thresholdsi+);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_hi
8、dden_weightsij+);67. System.out.println();68. 69. System.out.println(隐含层到输出层的连接);70. for(inti=0;iHIDDEN_DIM;i+)71. System.out.print(hidden_output_weightsi+);72. System.out.println();73. System.out.println(*);74. 75. 76. /*77. *初始化,对所有的权值产生一个(0,1)之间的随机double型值78. */79. voidinitialize()80. 81. /输入层到隐含
9、层的连接权重82. for(inti=0;iINPUT_DIM;i+)83. for(intj=0;jHIDDEN_DIM;j+)84. input_hidden_weightsij=Math.random();85. 86. 87. /隐含层到输出层的连接权重88. for(inti=0;iHIDDEN_DIM;i+)89. hidden_output_weightsi=Math.random();90. 91. /隐含层的阈值92. for(inti=0;iHIDDEN_DIM;i+)93. hidden_thresholdsi=Math.random();94. 95. /输出层的阈值9
10、6. 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(doubleinput)114. doublehiddenValues=newdoubleHIDDEN_DIM;115
11、. for(inti=0;ihiddenValues.length;i+)116. doublesum=0;117. for(intj=0;jinput.length;j+)118. sum+=inputj*input_hidden_weightsji;119. 120. sum+=hidden_thresholdsi;/再加上本神经元的阈值121. hiddenValuesi=function(sum);122. 123. 124. 125. doublesum=0;126. for(inti=0;iHIDDEN_DIM;i+)127. sum+=hiddenValuesi*hidden_o
12、utput_weightsi;128. 129. sum+=output_threshold;/输出层神经元的阈值130. returnfunction(sum);131. 132. 133. /*134. *进行一次训练135. *paraminput136. *paramexpectedOutput137. */138. voidtrainOnce(doubleinput,doubleexpectedOutput)139. doublehiddenValues=newdoubleHIDDEN_DIM;140. doublehiddenParams=newdoubleHIDDEN_DIM;1
13、41. 142. for(inti=0;ihiddenValues.length;i+)143. doublesum=0;144. for(intj=0;jinput.length;j+)145. sum+=inputj*input_hidden_weightsji;146. 147. sum+=hidden_thresholdsi;/148. hiddenValuesi=function(sum);149. hiddenParamsi=sum;150. 151. 152. doublesum=0;153. for(inti=0;iHIDDEN_DIM;i+)154. sum+=hiddenV
14、aluesi*hidden_output_weightsi;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-outputValu
15、e)*LEARNING_RATE*inputi;167. for(intj=0;jHIDDEN_DIM;j+)168. doubledelta=factor*hidden_output_weightsj*hiddenValuesj*(1-hiddenValuesj);169. /System.out.println(输入层到隐含层连接的权重调整:delta=+delta+ttweight=+input_hidden_weightsij);170. input_hidden_weightsij+=delta;171. 172. 173. doublefactor=(expectedOutput-
16、outputValue)*outputValue*(1-outputValue)*LEARNING_RATE;174. for(inti=0;ihidden_thresholds.length;i+)175. doubledelta=factor*hidden_output_weightsi*hiddenValuesi*(1-hiddenValuesi);176. hidden_thresholdsi+=delta;177. 178. 179. /System.out.println(hidden_output_weights:+hidden_output_weights.length);18
17、0. for(inti=0;i0.1)191. /System.out.println(input0+tt+outputValue+tt+expectedOutput);192. 193. 194. 195. 196. 197. 198. 2.测试代码javaview plaincopy1. packagepkg1;2. 3. importjava.awt.Graphics;4. importjava.util.Scanner;5. 6. importjavax.swing.JFrame;7. 8. publicclassDisplayNeuroextendsjavax.swing.JPane
18、l9. 10. publicstaticfinalintSIDE_LENGTH=200;11. 12. TestNeuroneuro;/=newTestNeuro();13. /*14. *paramargs15. */16. publicstaticvoidmain(Stringargs)17. /TODOAuto-generatedmethodstub18. DisplayNeurodn=newDisplayNeuro();19. JFramejFrame=newJFrame();20. jFrame.setBounds(100,100,300,300);21. jFrame.setDef
19、aultCloseOperation(JFrame.EXIT_ON_CLOSE);22. jFrame.add(dn);23. jFrame.setVisible(true);24. 25. TestNeuroneuro=newTestNeuro(1,20);26. dn.neuro=neuro;27. Scannerin=newScanner(System.in);28. dn.repaint();29. for(inti=0;i;i+)30. doubleinput=newdouble1;31. input0=Math.random()/2+0.25;32. doubleexpectedOutput=(Math.sin(3.14*(input0-0.25)*2*4)+1)/8*3+0.125;33. /System.out.println(input:+input0+ttexpectedO
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年中山大学中山眼科中心医护人员招聘笔试备考题库及答案详解
- 2026年宁波市第一医院医护人员招聘笔试备考题库及答案详解
- 2026年南京医科大学附属口腔医院医护人员招聘笔试参考试题及答案详解
- 2026年吉林大学第一医院二部医护人员招聘考试参考题库及答案详解
- 2026年湖北民族大学附属民大医院医护人员招聘笔试参考试题及答案详解
- 2026年国家开发银行(厦门分行)人员招聘考试备考题库及答案详解
- 2026年吉化集团公司总医院医护人员招聘考试参考试题及答案详解
- 2026年解放军四零一医院医护人员招聘考试参考题库及答案详解
- 2026年肇庆市中医院医护人员招聘笔试备考试题及答案详解
- 2026年十堰市人民医院医护人员招聘考试备考试题及答案详解
- 化学社团课课件
- 股动脉穿刺并发症护理
- 航空运输地面服务员(民航货运员)职业技能鉴定经典试题含答案
- 2024-2025学年北京市中国人民大学附中高一(下)期末数学试卷(含答案)
- 新疆阿克苏地区阿克苏市2024-2025学年七年级下学期历史期末测试卷
- 【高一下】连云港市2024~2025学年第二学期高一语文期末调研考试含答案
- 校长三年任期述职汇报:五维聚力守初心 奋楫笃行育新篇
- 外国公司绩效管理制度
- 2025届北京市中学国人民大附属中学数学八下期末质量检测试题含解析
- 中医经络学说与穴位保健
- 25春国家开放大学《园艺植物栽培学总论》形考任务1-3+实验实习参考答案
评论
0/150
提交评论