質問編集履歴

1

記載コードがあまりにもアバウトに削りすぎたため、見や少なるように修正を加えました。

2020/03/21 11:15

投稿

oshikosan
oshikosan

スコア4

test CHANGED
File without changes
test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  何卒よろしくお願いします。
10
10
 
11
- ※字数の都合上必要のないコードは削ってあります。詳細は下記参考書をご覧いただけると幸いです。
11
+ ※字数の都合上必要のないコードはサンプルコードから変更した箇所のみ載せてありますが、足りない点がありましたらご指摘願います主な変更点としまして使用するデータを通常のsin波としたことくらいです。サンプルコードは下記URLからご覧いただけると幸いです。
12
12
 
13
13
   実行環境
14
14
 
@@ -30,398 +30,186 @@
30
30
 
31
31
 
32
32
 
33
- %matplotlib inline
34
-
35
- import argparse
36
-
37
- import os
38
-
39
- import sys
40
-
41
- import time
42
-
43
- import matplotlib.pyplot as plt
44
-
45
- import numpy as np
46
-
47
- import tensorflow as tf
48
-
49
- from tensorflow.python.eager import context
50
-
51
-
52
-
53
- class FRNN(tf.keras.Model):
33
+ class Datasets(object):
54
-
34
+
55
- """エンコーダー
35
+ """ダデータの生成
56
36
 
57
37
  """
58
38
 
59
39
 
60
40
 
61
- class BRNN(tf.keras.Model):
62
-
63
- """デコーダ―
64
-
65
- """
66
-
67
- class EncDecAD(tf.keras.Model):
68
-
69
- """EncDec-ADの本体
70
-
71
- """
72
-
73
-
74
-
75
- def __init__(self,
76
-
77
- hidden_dim,
78
-
79
- n_dim_obs=1,
80
-
81
- training = True):
82
-
83
- super().__init__()
84
-
85
-
86
-
87
- # 観測値の次元
88
-
89
- self.n_dim_obs = n_dim_obs
90
-
91
- # エンコーダー
92
-
93
- self.f_lstm = FRNN(hidden_dim)
94
-
95
- # デコーダー
96
-
97
- self.b_lstm = BRNN(hidden_dim, n_dim_obs, training)
98
-
99
- self.trainig = training
100
-
101
-
102
-
103
- def reset(self, training):
104
-
105
- self.b_lstm.training = training
106
-
107
-
108
-
109
- def call(self, input_seq, training):
110
-
111
- # エンコーダー/デコーダ―のtrainingオプションの初期化
112
-
113
- self.reset(training)
114
-
115
-
116
-
117
- batch_size = input_seq.shape[1]
118
-
119
- seq_size = input_seq.shape[0]
120
-
121
-
122
-
123
- # エンコーダー側処理の実行
124
-
125
- h = self.f_lstm(input_seq)
126
-
127
- # デコーダー側の処理の実行
128
-
129
- outputs = self.b_lstm(h, seq_size, input_seq=input_seq)
130
-
131
- return outputs
132
-
133
-
134
-
135
-
136
-
137
- def train(model, optimizer, train_data, sequence_length, clip_ratio,
138
-
139
- training=True):
140
-
141
- """1エポック分の学習
142
-
143
- """
144
-
145
-
146
-
147
- def model_loss(inputs, targets):
148
-
149
- return loss_fn(model, inputs, targets, training=training)[0]
150
-
151
-
152
-
153
- total_time = 0
154
-
155
- batch_start_idx_range = range(0, train_data.shape[0]-1, sequence_length)
156
-
157
- for batch, i in enumerate(batch_start_idx_range):
158
-
159
- # バッチ毎にデータを取得
160
-
161
- train_seq, train_target = _get_batch(train_data, i, sequence_length)
162
-
163
- start = time.time()
164
-
165
- with tf.GradientTape() as tape:
166
-
167
- loss, _ = loss_fn(model, train_seq, train_target, training)
168
-
169
- # 勾配計算
170
-
171
- grads = tape.gradient(loss, model.trainable_variables)
172
-
173
-
174
-
175
- # パラメタ更新
176
-
177
- optimizer.apply_gradients(zip(grads, model.trainable_variables))
178
-
179
-
180
-
181
- total_time += (time.time() - start)
182
-
183
- if batch % 10 == 0:
184
-
185
- time_in_ms = (total_time * 1000) / (batch + 1)
186
-
187
- sys.stderr.write(
188
-
189
- "batch %d: training loss %.2f, avg step time %d ms\n" %
190
-
191
- (batch, model_loss(train_seq, train_target).numpy(),
192
-
193
- time_in_ms))
194
-
195
- training_loss = model_loss(train_seq, train_target)
196
-
197
- return training_loss
198
-
199
-
200
-
201
- def evaluate_(args, model, test_data, train_data, training=False):
202
-
203
- """最終エポック時に異常データでテスト
204
-
205
- """
206
-
207
- total_loss = 0.0
208
-
209
- total_batches = 0
210
-
211
- start = time.time()
212
-
213
- l_scores = []
214
-
215
- for _, i in enumerate(range(0, test_data.shape[0], args.seq_len)):
216
-
217
- # バッチ毎にデータを取得
218
-
219
- inp, target = _get_batch(test_data, i, args.seq_len)
220
-
221
- # 損失計算
222
-
223
- loss, outputs = loss_fn(model, inp, target, training=training)
224
-
225
- total_loss += loss.numpy()
226
-
227
- total_batches += 1
228
-
229
-
230
-
231
- _, batch_size, _= inp.shape
232
-
233
- # 異常スコアの計算
234
-
235
- scores = anomaly_score(outputs, target, train_data[:, :batch_size])
236
-
237
- l_scores.append(scores)
41
+ def __init__(self):
42
+
43
+ A = 10
44
+
45
+ # 訓練データ
46
+
47
+ t = np.linspace(0, 5*np.pi, 500)
48
+
49
+ self.train = A * np.sin(t).reshape(-1,1)
50
+
51
+ self.train = (self.train).astype('f')
52
+
53
+
54
+
55
+ # 検証データ
56
+
57
+ t = np.linspace(0, 5*np.pi, 500)
58
+
59
+ self.valid = A * np.sin(t).reshape(-1,1)
60
+
61
+ self.valid = (self.valid).astype('f')
62
+
63
+
64
+
65
+
66
+
67
+ data_ = Datasets()
68
+
69
+ seq_data = data_.test
70
+
71
+
72
+
73
+ def main(args):
74
+
75
+ if not args.data_path:
76
+
77
+ raise ValueError("Must specify --data-path")
78
+
79
+ # データセットの読み出し
80
+
81
+ data = Datasets()
82
+
83
+ # EncDec-ADへの入力用に形成した訓練データの作成
84
+
85
+ train_data = _divide_into_batches(data.train, args.batch_size)
86
+
87
+ # EncDec-ADへの入力用に形成したテストの作成
88
+
89
+ test_data = _divide_into_batches(data.test, args.eval_batch_size)
90
+
91
+ #test_data = _divide_into_batches(data.valid, args.eval_batch_size)
92
+
93
+
94
+
95
+
96
+
97
+ # GPUの有無の確認
98
+
99
+ have_gpu = context.num_gpus() > 0
100
+
101
+
102
+
103
+ # デバイス割り当て(GPUデバイスが検出されない場合は使わない)
104
+
105
+ with tf.device("/device:GPU:0" if have_gpu else None):
106
+
107
+ # 学習係数
108
+
109
+ # 学習係数は変化するのでVariableで定義
110
+
111
+ learning_rate = tf.Variable(args.learning_rate, name="learning_rate")
112
+
113
+ sys.stderr.write("learning_rate=%f\n" % learning_rate.numpy())
114
+
115
+ # EncDecADクラスのインスタンス作成
116
+
117
+ model = EncDecAD(args.hidden_dim, args.training)
118
+
119
+ # オプティマイザーオブジェクトの作成
120
+
121
+ optimizer = tf.keras.optimizers.Adam(learning_rate)
238
122
 
239
123
 
240
124
 
241
- return outputs, l_scores
125
+ best_loss = None
242
-
243
-
244
-
245
- class Datasets(object):
126
+
246
-
247
- """ダミーデータの生成
248
-
249
- """
250
-
251
-
252
-
253
- def __init__(self):
254
-
255
- A = 10
127
+ cnt = 0
128
+
256
-
129
+ evaluation_loss_ = []
130
+
131
+ training_loss_ = []
132
+
133
+ # エポック毎のループ
134
+
135
+ for _ in range(args.epoch):
136
+
257
- # 訓練データ
137
+ # 訓練データ
258
-
138
+
259
- t = np.linspace(0, 5*np.pi, 500)
139
+ training_loss_.append(train(model, optimizer, train_data, args.seq_len, args.clip))
140
+
260
-
141
+ # 検証データ
142
+
143
+ eval_loss, l_scores, outputs, evaluation_loss = evaluate(args, model, test_data, train_data)
144
+
261
- self.train = A * np.sin(t).reshape(-1,1)
145
+ evaluation_loss_.append(evaluation_loss)
146
+
262
-
147
+ # テストデータを使った評価での損失が下がった場合
148
+
149
+ if not best_loss or eval_loss < best_loss:
150
+
151
+ best_loss = eval_loss
152
+
153
+ cnt = 0
154
+
155
+ # テストデータを使った評価での損失が下がらなかった場合
156
+
157
+ else:
158
+
159
+ cnt += 1
160
+
161
+ # 6回連続で下がらなかった場合
162
+
163
+ if cnt>5:
164
+
165
+ # 学習係数を1/1.2倍する
166
+
167
+ learning_rate.assign(max(learning_rate/1.2, .002))
168
+
169
+ sys.stderr.write(
170
+
171
+ "eval_loss did not reduce in this epoch, "
172
+
173
+ "changing learning rate to %f for the next epoch\n" %
174
+
175
+ learning_rate.numpy())
176
+
177
+ cnt = 0
178
+
179
+
180
+
181
+ ###########ここでモデルの保存######################################
182
+
183
+ # save the model
184
+
185
+ tf.saved_model.save(model, "/tmp/saved_model/model")
186
+
187
+
188
+
189
+ #model._set_inputs(train_data[0, :])
190
+
191
+ #tf.keras.experimental.export_saved_model(model, "path_to_my_model", serving_only=True)
192
+
193
+ # save the weights
194
+
263
- self.train = (self.train).astype('f')
195
+ #model.save_weights('path_to_my_model.h5')
196
+
197
+
198
+
199
+ # モデルの定義
200
+
201
+ #model = EncDecAD(args.hidden_dim, args.training)
202
+
203
+ #############ここで保存済みの重みの読み込み###############################
204
+
205
+ # 学習済みの重みの読み込み
206
+
207
+ new_model = tf.saved_model.load("/tmp/saved_model/model")
264
208
 
265
209
 
266
210
 
267
211
  # 検証データ
268
212
 
269
- t = np.linspace(0, 5*np.pi, 500)
270
-
271
- self.valid = A * np.sin(t).reshape(-1,1)
272
-
273
- self.valid = (self.valid).astype('f')
274
-
275
-
276
-
277
-
278
-
279
- data_ = Datasets()
280
-
281
- seq_data = data_.test
282
-
283
-
284
-
285
- def main(args):
286
-
287
- if not args.data_path:
288
-
289
- raise ValueError("Must specify --data-path")
290
-
291
- # データセットの読み出し
292
-
293
- data = Datasets()
294
-
295
- # EncDec-ADへの入力用に形成した訓練データの作成
296
-
297
- train_data = _divide_into_batches(data.train, args.batch_size)
298
-
299
- # EncDec-ADへの入力用に形成したテストの作成
300
-
301
- test_data = _divide_into_batches(data.test, args.eval_batch_size)
302
-
303
- #test_data = _divide_into_batches(data.valid, args.eval_batch_size)
304
-
305
-
306
-
307
-
308
-
309
- # GPUの有無の確認
310
-
311
- have_gpu = context.num_gpus() > 0
312
-
313
-
314
-
315
- # デバイスの割り当て(GPUデバイスが検出されない場合は使わない)
316
-
317
- with tf.device("/device:GPU:0" if have_gpu else None):
318
-
319
- # 学習係数
320
-
321
- # 学習係数は変化するのでVariableで定義
322
-
323
- learning_rate = tf.Variable(args.learning_rate, name="learning_rate")
324
-
325
- sys.stderr.write("learning_rate=%f\n" % learning_rate.numpy())
326
-
327
- # EncDecADクラスのインスタンス作成
328
-
329
- model = EncDecAD(args.hidden_dim, args.training)
330
-
331
- # オプティマイザーオブジェクトの作成
332
-
333
- optimizer = tf.keras.optimizers.Adam(learning_rate)
334
-
335
-
336
-
337
- best_loss = None
338
-
339
- cnt = 0
340
-
341
- evaluation_loss_ = []
342
-
343
- training_loss_ = []
344
-
345
- # エポック毎のループ
346
-
347
- for _ in range(args.epoch):
348
-
349
- # 訓練データ
350
-
351
- training_loss_.append(train(model, optimizer, train_data, args.seq_len, args.clip))
352
-
353
- # 検証データ
354
-
355
- eval_loss, l_scores, outputs, evaluation_loss = evaluate(args, model, test_data, train_data)
356
-
357
- evaluation_loss_.append(evaluation_loss)
358
-
359
- # テストデータを使った評価での損失が下がった場合
360
-
361
- if not best_loss or eval_loss < best_loss:
362
-
363
- best_loss = eval_loss
364
-
365
- cnt = 0
366
-
367
- # テストデータを使った評価での損失が下がらなかった場合
368
-
369
- else:
370
-
371
- cnt += 1
372
-
373
- # 6回連続で下がらなかった場合
374
-
375
- if cnt>5:
376
-
377
- # 学習係数を1/1.2倍する
378
-
379
- learning_rate.assign(max(learning_rate/1.2, .002))
380
-
381
- sys.stderr.write(
382
-
383
- "eval_loss did not reduce in this epoch, "
384
-
385
- "changing learning rate to %f for the next epoch\n" %
386
-
387
- learning_rate.numpy())
388
-
389
- cnt = 0
390
-
391
-
392
-
393
- ###########ここでモデルの保存######################################
394
-
395
- # save the model
396
-
397
- tf.saved_model.save(model, "/tmp/saved_model/model")
398
-
399
-
400
-
401
- #model._set_inputs(train_data[0, :])
402
-
403
- #tf.keras.experimental.export_saved_model(model, "path_to_my_model", serving_only=True)
404
-
405
- # save the weights
406
-
407
- #model.save_weights('path_to_my_model.h5')
408
-
409
-
410
-
411
- # モデルの定義
412
-
413
- #model = EncDecAD(args.hidden_dim, args.training)
414
-
415
- #############ここで保存済みの重みの読み込み###############################
416
-
417
- # 学習済みの重みの読み込み
418
-
419
- new_model = tf.saved_model.load("/tmp/saved_model/model")
420
-
421
-
422
-
423
- # 検証データ
424
-
425
213
  outputs, l_scores = evaluate_(args, new_model, test_data, train_data)
426
214
 
427
215
 
@@ -434,60 +222,6 @@
434
222
 
435
223
 
436
224
 
437
- if __name__ == "__main__":
438
-
439
- parser = argparse.ArgumentParser()
440
-
441
- parser.add_argument(
442
-
443
- "--data-path",
444
-
445
- type=str,
446
-
447
- default="./src/chapter04/simple-examples/data",
448
-
449
- help="Data directory path")
450
-
451
- parser.add_argument(
452
-
453
- "--learning-rate", type=float, default=.07, help="Learning rate.")
454
-
455
- parser.add_argument(
456
-
457
- "--epoch", type=int, default=300, help="Number of epoches.")
458
-
459
- parser.add_argument(
460
-
461
- "--batch-size", type=int, default=1, help="Batch size.")
462
-
463
- parser.add_argument(
464
-
465
- "--eval-batch-size", type=int, default=1, help="Batch size.")
466
-
467
- parser.add_argument(
468
-
469
- "--seq-len", type=int, default=len(seq_data), help="Sequence length.")
470
-
471
- parser.add_argument(
472
-
473
- "--hidden-dim", type=int, default=15, help="Hidden layer dimension.")
474
-
475
- parser.add_argument(
476
-
477
- "--clip", type=float, default=0.3, help="Gradient clipping ratio.")
478
-
479
- parser.add_argument(
480
-
481
- "--training", type=bool, default=True, help="Training or not.")
482
-
483
-
484
-
485
- args, unparsed = parser.parse_known_args()
486
-
487
- main(args)
488
-
489
-
490
-
491
225
  ```
492
226
 
493
227
  該当エラー