質問編集履歴

1

追記

2018/09/26 06:07

投稿

rosbergf1
rosbergf1

スコア13

test CHANGED
@@ -1 +1 @@
1
- セグメンテーション違反原因わからない
1
+ 参照渡ししたはずvectorがなくなってる.
test CHANGED
@@ -1,32 +1,30 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- セグメンテーション違反の原因の解析
3
+ うまく参照渡しをして関数を実行させたい.
4
4
 
5
5
  ### 発生している問題・エラーメッセージ
6
6
 
7
-
8
-
9
7
  ```
10
8
 
11
- queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
9
+ * thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
12
-
10
+
13
- frame #0: 0x00000001000031d6 SIN`main [inlined] std::__1::vector<double, std::__1::allocator<double> >::operator[](this=0x3fc61830f313b330 size=1, __n=0) at vector:1493
11
+ frame #0: 0x0000000100004dbb SIN`BPTT(RNN=0x00007ffeefbfeed8, data=size=1, t=4, Func="tanh") at RNNsin.cp:377
14
-
12
+
15
- 1490 vector<_Tp, _Allocator>::operator[](size_type __n)
13
+ 374 for(j = 0; j < I_Unit; j++) {
16
-
17
- 1491 {
14
+
18
-
19
- 1492 _LIBCPP_ASSERT(__n < size(), "vector[] index out of bounds");
20
-
21
- -> 1493 return this->__begin_[__n];
15
+ 375 for(k = 0; k < M_Unit; k++) {
22
-
23
- 1494 }
16
+
24
-
25
- 1495
26
-
27
- 1496 template <class _Tp, class _Allocator>
17
+ 376 for(l = 0; l < O_Unit; l++) {
18
+
28
-
19
+ -> 377 ehNow[k][l] = (data[t*I_Unit + l] - RNN->o.n[l]) * RNN->m.v[k][l] * (1 - RNN->m.n[k] * RNN->m.n[k]);
20
+
29
- Target 0: (SIN) stopped.
21
+ 378 }
22
+
23
+ 379 }
24
+
25
+ 380 }
26
+
27
+
30
28
 
31
29
  ```
32
30
 
@@ -34,13 +32,215 @@
34
32
 
35
33
  ### 該当のソースコード
36
34
 
35
+ main関数は,
36
+
37
+ int main() {
38
+
39
+ vector<double> TS(TIME+1); //宣言
40
+
41
+ BPTT(&RNN, TS, t+T+1, Func); //関数の実行
42
+
43
+ }
44
+
37
- 以下リンクを参照してください.
45
+ といった感じ流れです.
38
46
 
39
47
  ```c++
40
48
 
49
+ void BPTT(ReccurentNeuralNetwork *RNN, const vector<double>& data, int t, string Func) {
50
+
51
+ int i, j, k, l;
52
+
53
+ vector< vector <double> > ehNow;
54
+
41
- https://www.dropbox.com/s/068eh5qefqrpcf8/RNNsin.cp?dl=0
55
+ ehNow = vector< vector <double> >(M_Unit, vector <double> (O_Unit));
56
+
42
-
57
+ vector< vector < vector <double > > > ehPast;
58
+
43
-
59
+ ehPast = vector < vector < vector <double> > >(T, vector<vector<double> >(M_Unit, vector<double>(O_Unit, 0)));
60
+
61
+ double delta, g;
62
+
63
+
64
+
65
+ for(j = 0; j < I_Unit; j++) {
66
+
67
+ for(k = 0; k < M_Unit; k++) {
68
+
69
+ for(l = 0; l < O_Unit; l++) {
70
+
71
+ ehNow[k][l] = (data[t*I_Unit + l] - RNN->o.n[l]) * RNN->m.v[k][l] * (1 - RNN->m.n[k] * RNN->m.n[k]);
72
+
73
+ }
74
+
75
+ }
76
+
77
+ }
78
+
79
+ for(l = 0; l < O_Unit; l++) {
80
+
81
+ for(i = 0; i < T; i++) {
82
+
83
+ for(j = 0; j < M_Unit; j++) {
84
+
85
+ ehPast[i][j][l] = 0;
86
+
87
+ for(k = 0; k < M_Unit; k++) {
88
+
89
+ if(i == 0)
90
+
91
+ ehPast[i][j][l] += ehNow[k][l] * RNN->m.w[j][k] * (1 - RNN->pm[i].n[j] * RNN->pm[i].n[j]);
92
+
93
+ else
94
+
95
+ ehPast[i][j][l] += ehPast[i-1][k][l] * RNN->m.w[j][k] * (1 - RNN->pm[i].n[j] * RNN->pm[i].n[j]);
96
+
97
+ }
98
+
99
+ }
100
+
101
+ }
102
+
103
+ }
104
+
105
+
106
+
107
+ //入力層の重みの更新ok
108
+
109
+ for(j = 0; j < I_Unit; j++) {
110
+
111
+ for(k = 0; k < M_Unit; k++) {
112
+
113
+ for(l = 0; l < O_Unit; l++) {
114
+
115
+ RNN->i.u[j][k] += eta * ehNow[k][l] * data[t*I_Unit + j];
116
+
117
+ }
118
+
119
+ }
120
+
121
+ }
122
+
123
+ for(i = 0; i < O_Unit; i++) {
124
+
125
+ for(j = 0; j < T; j++) {
126
+
127
+ for(k = 0; k < M_Unit; k++) {
128
+
129
+ for(l = 0; l < I_Unit; l++) {
130
+
131
+ delta = ehPast[j][k][i];
132
+
133
+ RNN->i.hu[l][k] += delta*delta;
134
+
135
+ g = eta / sqrt(RNN->i.hu[l][k]);
136
+
137
+ RNN->i.u[l][k] += g * delta * data[(t-T+j)*I_Unit + l];
138
+
139
+ }
140
+
141
+ }
142
+
143
+ }
144
+
145
+ }
146
+
147
+ //中間層のバイアスの更新
148
+
149
+ for(k = 0; k < M_Unit; k++) {
150
+
151
+ for(l = 0; l < O_Unit; l++) {
152
+
153
+ RNN->m.biasM[k] += eta * ehNow[k][l];
154
+
155
+ }
156
+
157
+ }
158
+
159
+ for(i = 0; i < O_Unit; i++) {
160
+
161
+ for(j = 0; j < T; j++) {
162
+
163
+ for(k = 0; k < M_Unit; k++) {
164
+
165
+ delta = ehPast[j][k][i];
166
+
167
+ RNN->m.hbiasM[k] += delta*delta;
168
+
169
+ g = eta / sqrt(RNN->m.hbiasM[k]);
170
+
171
+ RNN->m.biasM[k] += g * delta;
172
+
173
+ }
174
+
175
+ }
176
+
177
+ }
178
+
179
+ //中間層の重みの更新ok
180
+
181
+ for(i = 0; i < M_Unit; i++) {
182
+
183
+ for(j = 0; j < O_Unit; j++) {
184
+
185
+ RNN->m.hv[i][j] += (data[t*I_Unit + j] - RNN->o.n[j]) * RNN->m.n[i] * (data[t*I_Unit + j] - RNN->o.n[j]) * RNN->m.n[i];
186
+
187
+ RNN->m.v[i][j] += (eta * (data[t*I_Unit + j] - RNN->o.n[j]) * RNN->m.n[i]) / sqrt(RNN->m.hv[i][j]);
188
+
189
+ }
190
+
191
+ }
192
+
193
+ //フィードバック層の重みの更新ok
194
+
195
+ for(j = 0; j < M_Unit; j++) {
196
+
197
+ for(k = 0; k < M_Unit; k++) {
198
+
199
+ for(l = 0; l < O_Unit; l++) {
200
+
201
+ RNN->m.w[j][k] += eta * ehNow[k][l] * RNN->pm[0].n[j];
202
+
203
+ }
204
+
205
+ }
206
+
207
+ }
208
+
209
+ for(i = 0; i < O_Unit; i++) {
210
+
211
+ for(j = 0; j < T; j++) {
212
+
213
+ for(k = 0; k < M_Unit; k++) {
214
+
215
+ for(l = 0; l < M_Unit; l++) {
216
+
217
+ delta = ehPast[j][k][i];
218
+
219
+ RNN->m.hw[l][k] += delta*delta;
220
+
221
+ g = eta / sqrt(RNN->m.hw[l][k]);
222
+
223
+ RNN->m.w[l][k] += g * delta * RNN->pm[j+1].n[l];
224
+
225
+ }
226
+
227
+ }
228
+
229
+ }
230
+
231
+ }
232
+
233
+ //出力層のバイアスの更新ok
234
+
235
+ for(j = 0; j < O_Unit; j++) {
236
+
237
+ RNN->o.hbiasO[j] += (data[t*I_Unit + j] - RNN->o.n[j]) * (data[t*I_Unit + j] - RNN->o.n[j]);
238
+
239
+ RNN->o.biasO[j] += (eta * (data[t*I_Unit + j] - RNN->o.n[j])) / sqrt(RNN->o.hbiasO[j]);
240
+
241
+ }
242
+
243
+ }
44
244
 
45
245
  ```
46
246
 
@@ -48,6 +248,8 @@
48
248
 
49
249
  ### 試したこと
50
250
 
51
-
52
-
53
- デバッグを使って見てすが、どうもPastOutputが絡きに止まっているみたいです。
251
+ デバッグ見ていっところ, 関数BPTTに入るまは, TSはきちんと保持されている.
252
+
253
+ BPTTに入った途端に, sizeが0になり, 結果としてきちんと関数に渡されていない.
254
+
255
+ BPTT内の配列の数が多すぎることが原因であることは薄々感じているのですが, 書き方がこれしかない現状です...