質問編集履歴

2

2022/01/23 07:51

投稿

wagashi_157
wagashi_157

スコア51

test CHANGED
File without changes
test CHANGED
@@ -1,359 +1,180 @@
1
- #実現したいこと
1
+ # 実現したいこと
2
-
3
2
  ファイルから入力層のニューロン数N, 隠れ層のニューロン数L, 出力層のニューロン数M, データの数Tを読み込み, xor関数を隠れ層ニューロン数2個のネットワークで学習したいです。
4
-
5
- #今起きている問題
3
+ # 今起きている問題
6
-
7
- 学習後の誤差関数Eの値を表示しているのですが, 乱数で実装していることもあり学習に失敗するケースがあるところまでは承知しています。自分でなるべくxやyなどなるべく大きく配列を設定ました。しかし, Eの値が0.01以下になるようにしたいのにも関わらず, だいたい1.9の値を取っているため思ったような実装ができていません。その原因が分からないので, 教えていただきたいです。
4
+ 学習後の誤差関数Eの値を表示しているのですが, 乱数で実装していることもあり学習に失敗するケースがあるところまでは承知しています。しかし, Eの値が0.01以下になるようにしたいのにも関わらず, だいたい1.9の値を取っているため思ったような実装ができていません。その原因が分からないので, 教えていただきたいです。
8
-
9
- #実装コード・結果
5
+ # 実装コード・結果
10
-
11
6
  ```C++
12
-
13
7
  #include<iostream>
14
-
15
8
  #include<cmath>
16
-
17
9
  #include<cstdlib>
18
-
19
10
  using namespace std;
20
11
 
21
-
22
-
23
12
  double neuron(double x[], double weight[], double b, int n){
24
-
25
13
  double sum=0;
26
-
27
14
  for (int i=0; i<n; i++) {
28
-
29
15
  sum+=x[i]*weight[i];
30
-
31
16
  }
32
-
33
17
  sum+=b;
34
-
35
18
  return 1/(1+exp(-sum));
36
-
37
19
  }
38
20
 
39
-
40
-
41
21
  int main() {
42
-
43
22
  int N;
44
-
45
23
  int L;
46
-
47
24
  int M;
48
-
49
25
  int T;
50
-
51
26
  double E;
52
-
53
27
  cin>>N>>L>>M>>T;
54
-
55
28
 
56
-
57
29
  double x[200][10];
58
-
59
30
  double z[10];
60
-
61
31
  double y[10];
62
-
63
32
  double v[10];
64
-
65
33
 
66
-
67
34
  double t[200][10];
68
-
69
35
  double gamma=5;
70
-
71
36
 
72
-
73
37
  double w1[10][10];
74
-
75
38
  double w2[10][10];
76
-
77
39
  double b1[10];
78
-
79
40
  double b2[10];
80
-
81
41
  srand((unsigned)time(NULL));
82
-
83
42
  for (int k=0; k<L; k++) {
84
-
85
43
  for (int i=0; i<N; i++) {
86
-
87
44
  w1[k][i]=(double)rand()/((double)RAND_MAX+1);
88
-
89
45
  }
90
-
91
46
  b1[k]=(double)rand()/((double)RAND_MAX+1);
92
-
93
47
  }
94
-
95
48
  for (int j=0; j<M; j++) {
96
-
97
49
  for (int k=0; k<L; k++) {
98
-
99
50
  w2[j][k]=(double)rand()/((double)RAND_MAX+1);
100
-
101
51
  }
102
-
103
52
  b2[j]=(double)rand()/((double)RAND_MAX+1);
104
-
105
53
  }
106
-
107
54
 
108
-
109
55
  for(int c=0; c<1000; c++) {
110
-
111
56
  for(int p=0; p<T; p++) {
112
-
113
57
  for(int k=0; k<L; k++) {
114
-
115
58
  z[k]=neuron(x[p],w1[k],b1[k],N);
116
-
117
59
  }
118
-
119
60
  for (int j=0; j<M; j++) {
120
-
121
61
  y[j]=neuron(z,w2[j],b2[j],L);
122
-
123
62
  }
124
-
125
63
  for (int k=0; k<L; k++){
126
-
127
64
  v[k]=0;
128
-
129
65
  for(int j=0; j<M; j++){
130
-
131
66
  v[k]+=(y[j]-t[p][j])*(1-y[j])*y[j]*w2[j][k];
132
-
133
67
  }
134
-
135
68
  }
136
-
137
69
  for (int j=0; j<M; j++) {
138
-
139
70
  for (int k=0; k<L; k++) {
140
-
141
71
  w2[j][k]-=gamma*z[k]*(y[j]-t[p][j])*(1-y[j])*y[j];
142
-
143
72
  }
144
-
145
73
  b2[j]-=gamma*(y[j]-t[p][j])*(1-y[j])*y[j];
146
-
147
74
  }
148
-
149
75
  for (int k=0; k<L; k++) {
150
-
151
76
  for (int i=0; i<N; i++) {
152
-
153
77
  w1[k][i]-=gamma*x[p][i]*(1-z[k])*z[k]*v[k];
154
-
155
78
  }
156
-
157
79
  b1[k]-=gamma*(1-z[k])*z[k]*v[k];
158
-
159
80
  }
160
-
161
81
  }
162
-
163
82
  }
164
-
165
83
 
166
-
167
84
  for (int p=0; p<T; p++) {
168
-
169
85
  for (int i=0; i<N; i++) {
170
-
171
86
  cin>>x[p][i];
172
-
173
87
  }
174
-
175
88
  for (int j=0; j<M; j++) {
176
-
177
89
  cin>>t[p][j];
178
-
179
90
  }
180
-
181
91
  cout<<"x:";
182
-
183
92
  for(int i=0; i<N; i++){
184
-
185
93
  cout<<x[p][i]<<" ";
186
-
187
94
  }
188
-
189
95
  cout<<"z:";
190
-
191
96
  for(int k=0; k<L; k++){
192
-
193
97
  z[k]=neuron(x[p],w1[k],b1[k],N);
194
-
195
98
  cout<<z[k]<<" ";
196
-
197
99
  }
198
-
199
100
  cout<<"y:";
200
-
201
101
  for(int j=0; j<M; j++){
202
-
203
102
  y[j]=neuron(z,w2[j],b2[j],L);
204
-
205
103
  E+=(t[p][j]-y[j])*(t[p][j]-y[j]);
206
-
207
104
  cout<<y[j]<<" ";
208
-
209
105
  }
210
-
211
106
  cout<<endl;
212
-
213
107
  }
214
-
215
108
  cout<<"E:"<<E<<endl;
216
-
217
109
 
218
-
219
110
  for(int k=0; k<L; k++){
220
-
221
111
  cout<<"z"<<k<<" ";
222
-
223
112
  cout<<"w1:";
224
-
225
113
  for(int i=0; i<N; i++){
226
-
227
114
  cout<<w1[k][i]<<" ";
228
-
229
115
  }
230
-
231
116
  cout<<"b1:";
232
-
233
117
  cout<<b1[k]<<endl;
234
-
235
118
  }
236
-
237
119
 
238
-
239
120
  for(int j=0; j<M; j++) {
240
-
241
121
  cout<<"y"<<j<<" ";
242
-
243
122
  cout<<"w2:";
244
-
245
123
  for(int k=0; k<L; k++) {
246
-
247
124
  cout<<w2[j][k]<<" ";
248
-
249
125
  }
250
-
251
126
  cout<<"b2:";
252
-
253
127
  cout<<b2[j]<<endl;
254
-
255
128
  }
256
-
257
129
  return 0;
258
-
259
130
  }
260
-
261
131
  ```
262
-
263
132
  ```xor.txt
264
-
265
133
  2 2 1 4 //xor.txt
266
-
267
134
  0 0 0
268
-
269
135
  1 0 1
270
-
271
136
  0 1 1
272
-
273
137
  1 1 0
274
-
275
138
  ```
276
-
277
139
  **実行結果**
278
-
279
140
  $./a.exe<xor.txt
280
-
281
141
  x:0 0 z:0.724001 0.748752 y:0.00337414
282
-
283
142
  x:1 0 z:0.735373 0.782302 y:0.00313582
284
-
285
143
  x:0 1 z:0.778374 0.842381 y:0.0026458
286
-
287
144
  x:1 1 z:0.788161 0.865672 y:0.00250641
288
-
289
145
  E:1.98847
290
-
291
146
  z0 w1:0.0576604 0.291822 b1:0.964394
292
-
293
147
  z1 w1:0.187169 0.584085 b1:1.09196
294
-
295
148
  y0 w2:-1.71473 -1.60915 b2:-3.24191
296
149
 
297
-
298
-
299
150
  x:0 0 z:0.658774 0.775888 y:0.00337317
300
-
301
151
  x:1 0 z:0.806224 0.831015 y:0.00237437
302
-
303
152
  x:0 1 z:0.832161 0.856353 y:0.00215879
304
-
305
153
  x:1 1 z:0.91442 0.894382 y:0.0017471
306
-
307
154
  E:1.99096
308
-
309
155
  z0 w1:0.767824 0.943183 b1:0.657835
310
-
311
156
  z1 w1:0.350974 0.543466 b1:1.24186
312
-
313
157
  y0 w2:-1.58821 -2.13942 b2:-2.98231
314
158
 
315
-
316
-
317
159
  x:0 0 z:0.677479 0.578337 y:0.00358413
318
-
319
160
  x:1 0 z:0.844232 0.702535 y:0.00222868
320
-
321
161
  x:0 1 z:0.835425 0.727025 y:0.00219048
322
-
323
162
  x:1 1 z:0.929065 0.820985 y:0.00162254
324
-
325
163
  E:1.99119
326
-
327
164
  z0 w1:0.947847 0.882365 b1:0.74221
328
-
329
165
  z1 w1:0.543451 0.663632 b1:0.31595
330
-
331
166
  y0 w2:-1.83804 -1.36851 b2:-3.59096
332
167
 
333
-
334
-
335
168
  x:0 0 z:0.735721 0.798222 y:0.00329615
336
-
337
169
  x:1 0 z:0.800865 0.905335 y:0.00236951
338
-
339
170
  x:0 1 z:0.829731 0.865813 y:0.00245969
340
-
341
171
  x:1 1 z:0.87562 0.939754 y:0.00195537
342
-
343
172
  E:1.99037
344
-
345
173
  z0 w1:0.367866 0.559878 b1:1.02384
346
-
347
174
  z1 w1:0.882749 0.489222 b1:1.37522
348
-
349
175
  y0 w2:-1.60078 -2.11665 b2:-2.84442
350
176
 
351
-
352
-
353
- #試したこと
177
+ # 試したこと
354
-
355
178
  まず, xやyの配列がdouble型になっているかを確認しました。その次に, Eを求めるところで(t[p][j]-y[j])*(t[p][j]-y[j])を(y[j]-t[p][j])*(y[j]-t[p][j])と値の順序を変えてみました。
356
-
357
- #補足
179
+ # 補足
358
-
359
180
  C++17を使用しています。

1

空の配列をなるべく大きくしたいということを追記した。

2022/01/08 13:50

投稿

wagashi_157
wagashi_157

スコア51

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  #今起きている問題
6
6
 
7
- 学習後の誤差関数Eの値を表示しているのですが, 乱数で実装していることもあり学習に失敗するケースがあるところまでは承知しています。しかし, Eの値が0.01以下になるようにしたいのにも関わらず, だいたい1.9の値を取っているため思ったような実装ができていません。その原因が分からないので, 教えていただきたいです。
7
+ 学習後の誤差関数Eの値を表示しているのですが, 乱数で実装していることもあり学習に失敗するケースがあるところまでは承知しています。自分でなるべくxやyなどなるべく大きく配列を設定ました。しかし, Eの値が0.01以下になるようにしたいのにも関わらず, だいたい1.9の値を取っているため思ったような実装ができていません。その原因が分からないので, 教えていただきたいです。
8
8
 
9
9
  #実装コード・結果
10
10