1BP神经网络实现(JAVA代码)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

BP神经网络实现(Java代码)

神经网络的原理虽然理解起来不难,但是要是想实现它,还是需要做一些工作的,并且有很多细节性的东西需要注意。通过参阅各种相关资料,以及参考网络上已有的资源,自己写了一个含有一个隐含层,且只能有一个输出单元的简单的BP网络,经过测试,达到了预期的效果。

需要说明的是,神经网络的每个输入都在[0,1]中,输出也在[0,1]中,在使用神经网络解决实际问题的时候,还需要对实际问题的输入输出进行归一化处理。另外,尽量不要使得神经网络的输入或输出接近于0或1,这样会影响拟合效果。

我用正弦函数进行了一次测试,效果如图所示:

以下是相关的代码:

1.神经网络代码

[java]view plaincopy

1.package pkg1;

2.

3.import java.util.Scanner;

4.

5./*

6.*

7.*/

8.public class TestNeuro{

9.

10.private int INPUT_DIM=1;

11.private int HIDDEN_DIM=20;

12.private double LEARNING_RATE=0.05;

13.double[][]input_hidden_weights=new double[INPUT_DIM][HIDDEN_DIM];

14.double[]hidden_output_weights=new double[HIDDEN_DIM];

15.double[]hidden_thresholds=new double[HIDDEN_DIM];

16.double output_threshold;

17.

18.public static void main(String[]args){

19.Scanner in=new Scanner(System.in);

20.TestNeuro neuro=new TestNeuro(1,5);

21.neuro.initialize();

22.for(int i=0;i<10000;i++){

23.double[]input=new double[1];

24.input[0]=Math.random();

25.double expectedOutput=input[0]*input[0];

26.//System.out.println("input:"+input[0]+"\t\texpectedOutput:

"+expectedOutput);

27.//System.out.println("predict before training:"+neuro.predict

(input));

28.neuro.trainOnce(input,expectedOutput);

29.//System.out.println("predict after training:"+neuro.predict(

input));

30.//in.next();

31.}

32.while(true){

33.//neuro.printLinks();

34.double[]input=new double[1];

35.input[0]=in.nextDouble();

36.double expectedOutput=in.nextDouble();

37.System.out.println("predict before training:"+neuro.predict(i

nput));

38.neuro.trainOnce(input,expectedOutput);

39.System.out.println("predict after training:"+neuro.predict(in

put));

40.

41.}

42.}

43.

44.public TestNeuro(int input_dimension,int hidden_dimension){

45.this.INPUT_DIM=input_dimension;

46.this.HIDDEN_DIM=hidden_dimension;

47.this.initialize();

48.}

49.

50.

51./**

52.*打印出本神经元网络各层之间的连接权重,以及各个神经元上的阈值的信息。

53.*/

54.void print(){

55.System.out.println("隐含层阈值:");

56.for(int i=0;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(int i=0;i

65.for(int j=0;j

66.System.out.print(input_hidden_weights[i][j]+"");

67.}System.out.println();

68.}

69.System.out.println("隐含层到输出层的连接");

70.for(int i=0;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.void initialize(){

80.

81.//输入层到隐含层的连接权重

82.for(int i=0;i

83.for(int j=0;j

84.input_hidden_weights[i][j]=Math.random();

85.}

86.}

87.//隐含层到输出层的连接权重

88.for(int i=0;i

89.hidden_output_weights[i]=Math.random();

90.}

91.//隐含层的阈值

相关文档
最新文档