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

質問編集履歴

2

大幅に質問内容を変更しました

2017/12/22 09:13

投稿

kamome01
kamome01

スコア16

title CHANGED
File without changes
body CHANGED
@@ -1,329 +1,4 @@
1
1
  ###前提・実現したいこと
2
2
  Kerasのライブラリを使い,GRUに複数の時系列データを学習させたいのですが手段がわかりません.
3
3
  現在は,時系列データを1パターンだけ学習させ,テストデータを与えるところまでは出ています.
4
- 具体的には,時系列データのdatファイルが30個あり,15個を学習データ,15個をテストデータとして用いたいのです.
4
+ 具体的には,時系列データのdatファイルが30個あり,15個を学習データ,15個をテストデータとして用いたいのです.
5
-
6
-
7
- ###該当のソースコード
8
- ```python
9
- import numpy as np
10
- import matplotlib.pyplot as plt
11
- from keras.models import Sequential
12
- from keras.layers.core import Dense, Activation
13
- from keras.layers.recurrent import GRU
14
- from keras.optimizers import Adam
15
- from keras.callbacks import EarlyStopping
16
- from sklearn.model_selection import train_test_split
17
- import os
18
-
19
- np.random.seed(0)
20
-
21
- def zscore(x, axis = None):
22
- xmean = x.mean(axis=axis, keepdims=True)
23
- xstd = np.std(x, axis=axis, keepdims=True)
24
- zscore = (x-xmean)/xstd
25
- return zscore
26
-
27
- def read(N=10, T=200):
28
- a=np.loadtxt('pre10.dat',delimiter=' ',usecols=0)
29
- b=np.loadtxt('pre10.dat',delimiter=' ',usecols=3)
30
- c=np.loadtxt('pre10.dat',delimiter=' ',usecols=1)
31
- d=np.loadtxt('pre10.dat',delimiter=' ',usecols=2)
32
- a=zscore(a)
33
- c=zscore(c)
34
- d=zscore(d)
35
- signals = np.zeros((N,T))
36
- for i in range(N):
37
- signals[i] = a[i]
38
- sig2=np.zeros((N,T))
39
- for i in range(N):
40
- sig2[i] = c[i]
41
- sig3=np.zeros((N,T))
42
- for i in range(N):
43
- sig3[i] = d[i]
44
- masks = np.zeros((N, T))
45
- for i in range(N):
46
- masks[i] = b[i]
47
- data = np.zeros((N, T, 3))
48
- data[:, :, 0] = signals[:]
49
- data[:, :, 1] = sig2[:]
50
- data[:, :, 2] = sig3[:]
51
- target = np.zeros((N,T))
52
- for i in range(N):
53
- target[i]=b[i]
54
- return (data, target)
55
-
56
- def read_test(N=10, T=200):
57
- a=np.loadtxt('pre14.dat',delimiter=' ',usecols=0)
58
- c=np.loadtxt('pre14.dat',delimiter=' ',usecols=1)
59
- d=np.loadtxt('pre14.dat',delimiter=' ',usecols=2)
60
- a=zscore(a)
61
- c=zscore(c)
62
- d=zscore(d)
63
- signals = np.zeros((N,T))
64
- for i in range(N):
65
- signals[i] = a[i]
66
- sig2=np.zeros((N,T))
67
- for i in range(N):
68
- sig2[i] = c[i]
69
- sig3=np.zeros((N,T))
70
- for i in range(N):
71
- sig3[i] = d[i]
72
- data = np.zeros((N, T, 3))
73
- data[:, :, 0] = signals[:]
74
- data[:, :, 1] = sig2[:]
75
- data[:, :, 2] = sig3[:]
76
- return (data)
77
-
78
-
79
-
80
- '''
81
- モデルファイル用設定
82
- '''
83
- MODEL_DIR = os.path.join(os.path.dirname(__file__), 'model')
84
-
85
- if os.path.exists(MODEL_DIR) is False:
86
- os.mkdir(MODEL_DIR)
87
-
88
-
89
-
90
- '''
91
- データの読み取り
92
- '''
93
- N = 13999
94
- T = 200
95
- maxlen = T
96
-
97
- X, Y = read(N=N, T=T)
98
- X_test=read_test(N=N,T=T)
99
- N_train = int(N * 0.9)
100
- N_validation = N - N_train
101
-
102
- '''
103
- モデル設定
104
- '''
105
- n_in = len(X[0][0]) # 2
106
- n_hidden = 100
107
- n_out = len(Y[0]) # 1
108
-
109
-
110
- def weight_variable(shape, name=None):
111
- return np.random.normal(scale=.01, size=shape)
112
-
113
-
114
- early_stopping = EarlyStopping(monitor='loss', patience=100, verbose=1)
115
-
116
- kernel=weight_variable
117
- kernel2=weight_variable
118
-
119
- model = Sequential()
120
- model.add(GRU(n_hidden,
121
- #kernel_initializer=kernel,
122
- input_shape=(maxlen, n_in)))
123
- model.add(Dense(n_out))
124
- model.add(Activation('linear'))
125
-
126
- optimizer = Adam(lr=0.001, beta_1=0.9, beta_2=0.999)
127
- model.compile(loss='mean_squared_error',
128
- optimizer=optimizer)
129
-
130
- '''
131
- モデル学習
132
- '''
133
-
134
- epochs = 1000
135
- batch_size = 100
136
-
137
- hist = model.fit(X, Y,
138
- batch_size=batch_size,
139
- epochs=epochs,
140
- callbacks=[early_stopping])
141
-
142
- model.save(MODEL_DIR+'/model_relu.hdf5')
143
- print('Model saved')
144
-
145
- '''
146
- 学習の進み具合を可視化
147
- '''
148
-
149
- loss = hist.history['loss']
150
-
151
- plt.figure(1)
152
- plt.rc('font', family='serif')
153
- plt.plot(range(len(loss)), loss, label='loss', color='black')
154
- plt.xlabel('epochs')
155
-
156
-
157
-
158
- predicted = model.predict(X_test)
159
- A = np.loadtxt('pre14.dat',delimiter=' ',usecols=0)
160
- A=zscore(A)
161
-
162
- plt.figure(2)
163
- plt.ylim([-3, 3])
164
- plt.plot(A, color='#aaaaaa')
165
- #plt.plot(B,color='black' )
166
- plt.plot(predicted, color='red')
167
- plt.show()
168
- #plt.savefig(__file__ + '.eps')
169
-
170
- ```
171
-
172
- ###試したこと
173
- https://teratail.com/questions/105989 で回答を頂いたように,
174
- ```
175
- dat_paths = glob.glob("pre*.dat")
176
- a = [np.loadtxt(dat_path,delimiter=' ',usecols=0)for dat_path in dat_paths]
177
- b = [np.loadtxt(dat_path,delimiter=' ',usecols=3)for dat_path in dat_paths]
178
- c = [np.loadtxt(dat_path,delimiter=' ',usecols=1)for dat_path in dat_paths]
179
- d = [np.loadtxt(dat_path,delimiter=' ',usecols=2)for dat_path in dat_paths]
180
- ```
181
- 上記のように読み込み関数を書き換えたのですが,これだけではそれ以降の処理でエラーが出るのと,なにより複数サンプル学習させる方法として正しいのかわかりません.
182
- ちなみに,他にも少し書き換えているのでコードの全容を載せておきます
183
- ```
184
- import numpy as np
185
- import matplotlib.pyplot as plt
186
- from keras.models import Sequential
187
- from keras.layers.core import Dense, Activation
188
- from keras.layers.recurrent import GRU
189
- from keras.optimizers import Adam
190
- from keras.callbacks import EarlyStopping
191
- from sklearn.model_selection import train_test_split
192
- from sklearn.utils import shuffle
193
- import os
194
- import glob
195
-
196
-
197
- np.random.seed(0)
198
-
199
- def zscore(x, axis = None):
200
- xmean = x.mean(axis=axis, keepdims=True)
201
- xstd = np.std(x, axis=axis, keepdims=True)
202
- zscore = (x-xmean)/xstd
203
- return zscore
204
-
205
- def read(N=10, T=200):
206
- dat_paths = glob.glob("pre*.dat")
207
- A = [np.loadtxt(dat_path,delimiter=' ',usecols=0)for dat_path in dat_paths]
208
- b = [np.loadtxt(dat_path,delimiter=' ',usecols=3)for dat_path in dat_paths]
209
- C = [np.loadtxt(dat_path,delimiter=' ',usecols=1)for dat_path in dat_paths]
210
- D = [np.loadtxt(dat_path,delimiter=' ',usecols=2)for dat_path in dat_paths]
211
- #a=np.loadtxt('*.dat',delimiter=' ',usecols=0)
212
- #b=np.loadtxt('*.dat',delimiter=' ',usecols=3)
213
- #c=np.loadtxt('*.dat',delimiter=' ',usecols=1)
214
- #d=np.loadtxt('*.dat',delimiter=' ',usecols=2)
215
-
216
- signals = np.zeros((N,T))
217
- for i in range(N):
218
- signals[i] = a[i]
219
- sig2=np.zeros((N,T))
220
- for i in range(N):
221
- sig2[i] = c[i]
222
- sig3=np.zeros((N,T))
223
- for i in range(N):
224
- sig3[i] = d[i]
225
- masks = np.zeros((N, T))
226
- for i in range(N):
227
- masks[i] = b[i]
228
- data = np.zeros((N, T, 3))
229
- data[:, :, 0] = signals[:]
230
- data[:, :, 1] = sig2[:]
231
- data[:, :, 2] = sig3[:]
232
- target = np.zeros((N,T))
233
- for i in range(N):
234
- target[i]=b[i]
235
- return (data, target)
236
-
237
-
238
- '''
239
- モデルファイル用設定
240
- '''
241
- MODEL_DIR = os.path.join(os.path.dirname(__file__), 'model')
242
-
243
- if os.path.exists(MODEL_DIR) is False:
244
- os.mkdir(MODEL_DIR)
245
-
246
-
247
-
248
- '''
249
- データの読み取り
250
- '''
251
- N = 500000
252
- T = 200
253
- maxlen = T
254
-
255
- X, Y = read(N=N, T=T)
256
- N_train = int(N * 0.9)
257
- N_validation = N - N_train
258
-
259
- X_train,X_test,Y_train,Y_test=\
260
- train_test_split(X,Y,train_size=train_size)
261
- X_train,X_validation,Y_train,Y_validation= \
262
- train_test_split(X_train,Y_train,train_size=N_validation)
263
-
264
- '''
265
- モデル設定
266
- '''
267
- n_in = len(X[0][0]) # 2
268
- n_hidden = 100
269
- n_out = len(Y[0]) # 1
270
-
271
-
272
- def weight_variable(shape, name=None):
273
- return np.random.normal(scale=.01, size=shape)
274
-
275
-
276
- early_stopping = EarlyStopping(monitor='loss', patience=100, verbose=1)
277
-
278
- kernel=weight_variable
279
- kernel2=weight_variable
280
-
281
- model = Sequential()
282
- model.add(GRU(n_hidden,
283
- #kernel_initializer=kernel,
284
- input_shape=(maxlen, n_in)))
285
- model.add(Dense(n_out))
286
- model.add(Activation('linear'))
287
-
288
- optimizer = Adam(lr=0.001, beta_1=0.9, beta_2=0.999)
289
- model.compile(loss='mean_squared_error',
290
- optimizer=optimizer)
291
-
292
- '''
293
- モデル学習
294
- '''
295
-
296
- epochs = 1000
297
- batch_size = 100
298
-
299
- hist = model.fit(X_train, Y_train,
300
- batch_size=batch_size,
301
- epochs=epochs,
302
- validation_data=(X_validation,Y_validation),
303
- callbacks=[early_stopping])
304
-
305
- model.save(MODEL_DIR+'/model_GRU.hdf5')
306
- print('Model saved')
307
-
308
- '''
309
- 学習の進み具合を可視化
310
- '''
311
-
312
-
313
- val_loss=hist.history['val_loss']
314
- val_acc=hist.history['val_acc']
315
-
316
- loss_and_metrics=model.evaluate(X_test,Y_test)
317
- print(loss_and_metrics)
318
-
319
- plt.figure(1)
320
- plt.plot(range(len(val_acc)),val_acc,label='acc',color='red')
321
- plt.xlabel('epochs')
322
-
323
- plt.figure(2)
324
- plt.plot(range(len(val_loss)),val_loss,label='loss',color='red')
325
- plt.xlabel('epochs')
326
-
327
- plt.show()
328
-
329
- ```

1

タグの編集

2017/12/22 09:13

投稿

kamome01
kamome01

スコア16

title CHANGED
File without changes
body CHANGED
File without changes