質問編集履歴
2
機体の結果が得られないことについての予測原因の記入・追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -132,4 +132,5 @@
|
|
132
132
|
|
133
133
|
|
134
134
|
###一言
|
135
|
-
自分のできる範囲で参考書を調べ、導出式などを確認してみたのですが、改善されませんでした。どうか相談に乗っていただけると助かります。
|
135
|
+
自分のできる範囲で参考書を調べ、導出式などを確認してみたのですが、改善されませんでした。どうか相談に乗っていただけると助かります。
|
136
|
+
計算過程で二乗誤差が小さくならないなど計算過程に問題があるようなのですが・・
|
1
ご指摘いただいた配列の変数や要素数について修正を行いました。まだ目的の解決には至っていないのでご協力お願いします。
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
|
-
|
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
|
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 ==
|
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
|
-
|
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[
|
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[
|
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
|
116
|
+
if(learing_count < 100){
|
126
|
-
printf("%lf %lf %lf %lf %lf\n",E,delta3
|
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
|
```
|