質問するログイン新規登録

質問編集履歴

2

機体の結果が得られないことについての予測原因の記入・追加

2020/05/26 11:34

投稿

RyosuK.S
RyosuK.S

スコア45

title CHANGED
File without changes
body CHANGED
@@ -132,4 +132,5 @@
132
132
 
133
133
 
134
134
  ###一言
135
- 自分のできる範囲で参考書を調べ、導出式などを確認してみたのですが、改善されませんでした。どうか相談に乗っていただけると助かります。
135
+ 自分のできる範囲で参考書を調べ、導出式などを確認してみたのですが、改善されませんでした。どうか相談に乗っていただけると助かります。
136
+ 計算過程で二乗誤差が小さくならないなど計算過程に問題があるようなのですが・・

1

ご指摘いただいた配列の変数や要素数について修正を行いました。まだ目的の解決には至っていないのでご協力お願いします。

2020/05/26 11:34

投稿

RyosuK.S
RyosuK.S

スコア45

title CHANGED
File without changes
body CHANGED
@@ -19,22 +19,13 @@
19
19
  #define ITERATIONS (100000)//繰り返し回数
20
20
 
21
21
 
22
- double sigmoid(double net){// sigmoid関数により各層,各ニューロンのoutを返す。
23
- return 1/(1+exp(- net));
24
- }
25
22
 
23
+
26
24
  //重みの初期値設定(乱数)
27
- /*保留:Haivierhの初期値
25
+
28
- double Uniform( void ){
29
- return ((double)rand()+1.0)/((double)RAND_MAX+2.0);
30
- }
31
- double rand_normal( double mu, double sigma ){//mu:平均,sigma:標準偏差
32
- double z=sqrt( -2.0*log(Uniform()) ) * sin( 2.0*M_PI*Uniform() );
33
- return mu + sigma*z;
34
- }
35
- */
36
26
  double default_value(){//重みを−1~1で初期設定
37
27
  return (rand() / (double)RAND_MAX)*2-1;
28
+
38
29
  }
39
30
 
40
31
 
@@ -55,11 +46,11 @@
55
46
  }
56
47
 
57
48
  //バイアス・重みの初期値設定
58
- double bias[9] = {0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1};//{0,0,0,0,0,0,0,0,0};
49
+ double bias[9] = {0,0,0,0,0,0,0,0,0};
59
50
  double w1[9]; //入力層→隠れ層の重み
60
51
  double w2[10];//隠れ層→出力層の重み(w_2[0]はバイアス)
61
52
  for(count = 0;count<=9;count++){
62
- if(count == 10){
53
+ if(count == 9){//訂正
63
54
  w2[count] = default_value();
64
55
  }
65
56
  else{
@@ -68,15 +59,7 @@
68
59
  }
69
60
  }
70
61
  w2[0] = 0;//バイアスの初期値は0に設定
71
- /*重みの初期値の確認
62
+
72
- double w_11 = 0;
73
- double w_22 = 0;
74
- for(count = 0;count<10;count++){
75
- w_11 += w1[count];
76
- w_22 += w2[count];
77
- printf("%lf と %lf\n",w1[count],w2[count]);
78
- }
79
- */
80
63
  double p = 0.01;//学習率
81
64
  double net2[9];//隠れ層への入力
82
65
  double out2[10];//出力層への出力
@@ -89,6 +72,16 @@
89
72
  //double del_E;//∂E/∂w(or ∂E/∂bias)
90
73
  int i = 0;
91
74
  for(count = 0;count<50;count++){//サンプルされた50点のに対するそ処理
75
+ for(int count2 = 0;count2<=9;count2++){//重みの初期値設定
76
+ if(count2 == 9){//訂正
77
+ w2[count2] = default_value();
78
+ }
79
+ else{
80
+ w1[count2] = default_value();
81
+ w2[count2] = default_value();
82
+ }
83
+ }
84
+ w2[0] = 0;//バイアスの初期値は0に設定
92
85
  for(int learing_count=0;learing_count < ITERATIONS+1;learing_count++){//学習回数10万回についての処理,*「ITERATIONS+1」にした理由→10万回学習させた後に最終的な出力を出すため
93
86
  for(i = 0;i < 9;i++){
94
87
  net2[i] = w1[i]*x[count] + bias[i];
@@ -99,12 +92,9 @@
99
92
  net3 += w2[i]*out2[i];
100
93
  }
101
94
  out3[count] = 1/(1 + exp(-net3));
102
- if(learing_count % 10000 == 0){
95
+
103
- printf("%lf %lf %lfだよ\n",net2[3],out2[3],out3[count]);
104
- }
105
96
  //二乗誤差
106
- E =0.50*(y[count] - out3[count])*(y[count] - out3[count]);
97
+ E = 0.50*(y[count] - out3[count])*(y[count] - out3[count]);
107
-
108
98
  if(E == 0.0){
109
99
  //printf("%d %lf\n",count,out3[count]);
110
100
  break;
@@ -112,6 +102,7 @@
112
102
  else{
113
103
  //NR
114
104
  }
105
+
115
106
  //重み更新(出力~隠れ層間)
116
107
  delta3 = (out3[count] - y[count])*out3[count]*(1-out3[count]);//(out3[count] - y[count])*exp(-net3)/((1+exp(-net3))*(1+exp(-net3)));
117
108
 
@@ -119,11 +110,11 @@
119
110
  w2[i] = w2[i] - p*delta3*out2[i];
120
111
  }
121
112
  for(i = 0;i < 9;i++){
122
- bias[i] = bias[i] - p*delta3 * w2[i+1]*out2[count]*(1-out2[count]);//bias[i] - p*delta3 * w2[i+1]*exp(-net2[i])/((1+exp(-net2[i]))*(1+exp(-net2[i])));
113
+ bias[i] = bias[i] - p*delta3 * w2[i+1]*out2[i+1]*(1-out2[i+1]);//bias[i] -= p*delta3 * w2[i+1]*exp(-net2[i])/((1+exp(-net2[i]))*(1+exp(-net2[i])));
123
- w1[i] = w1[i] - p*x[count]*delta3 * w2[i+1]*out2[count]*(1-out2[count]);//w1[i] - p*x[count]*delta3 * w2[i+1]*exp(-net2[i])/((1+exp(-net2[i]))*(1+exp(-net2[i])));
114
+ w1[i] = w1[i] - p*x[count]*delta3 * w2[i+1]*out2[i+1]*(1-out2[i+1]);//w1[i] -= p*x[count]*delta3 * w2[i+1]*exp(-net2[i])/((1+exp(-net2[i]))*(1+exp(-net2[i])));
124
115
  }
125
- if(learing_count % 10000 == 0){
116
+ if(learing_count < 100){
126
- printf("%lf %lf %lf %lf %lf\n",E,delta3,bias[3],w1[3],w2[3]);
117
+ printf("%lf %lf %lf %lf %lf %lf %lfだよ\n",E,delta3*out2[3],w1[3],w2[3],net2[3],out2[3],out3[count]);
127
118
  }
128
119
  }
129
120
 
@@ -133,6 +124,8 @@
133
124
  for(count = 0;count<50;count++){
134
125
  fprintf(fp,"%lf\t%lf\t%lf\n",x[count],y[count],out3[count]);
135
126
  }
127
+
128
+ fclose(fp);
136
129
  return 0;
137
130
  }
138
131
  ```