参考書に記載されていたLSTMを使った異常検知プログラムのモデルのアーキテクチャが保存できません。
tf.keras.modelを使ってモデル本体をsubclass形式で構築しているのですが、下記のようなエラーが出てきてしまいました。おそらくエラーの内容は「モデルを構成するinputの情報が足りない」といったものだと思うのですが、モデルの構造が複雑すぎて手動でモデルにinputを付け加える可能だと思います(自分の実力不足なのは否めませんが)。また、モデル本体をSequential modelにしてしまおうかとも思ったのですが、こちらもなかなか手ごわそうです。
そこで、もし何かほかに良いモデルの保存方法があれば是非ご教授願いたいです。
因みにモデルの重みのみを保存することには成功したのでそれを使った方法などもあれば教えていただきたいです。
何卒よろしくお願いします。
※字数の都合上必要のないコードはサンプルコードから変更した箇所のみ載せてありますが、足りない点がありましたらご指摘願います。主な変更点としましては使用するデータを通常のsin波としたことくらいです。サンプルコードは下記URLからご覧いただけると幸いです。
実行環境
cpu : windows10
tensorflow : 2.0(cpu)
python : 3.7
該当参考書 : 島田直希.Advanced Python[時系列解析].第四章(LSTM Enc Dec Anomaly Detection)
コード記載URL:https://www.kyoritsu-pub.co.jp/bookdetail/9784320044722
該当コード
python
1 2class Datasets(object): 3 """ダミーデータの生成 4 """ 5 6 def __init__(self): 7 A = 10 8 # 訓練データ 9 t = np.linspace(0, 5*np.pi, 500) 10 self.train = A * np.sin(t).reshape(-1,1) 11 self.train = (self.train).astype('f') 12 13 # 検証データ 14 t = np.linspace(0, 5*np.pi, 500) 15 self.valid = A * np.sin(t).reshape(-1,1) 16 self.valid = (self.valid).astype('f') 17 18 19data_ = Datasets() 20seq_data = data_.test 21 22def main(args): 23 if not args.data_path: 24 raise ValueError("Must specify --data-path") 25 # データセットの読み出し 26 data = Datasets() 27 # EncDec-ADへの入力用に形成した訓練データの作成 28 train_data = _divide_into_batches(data.train, args.batch_size) 29 # EncDec-ADへの入力用に形成したテストの作成 30 test_data = _divide_into_batches(data.test, args.eval_batch_size) 31 #test_data = _divide_into_batches(data.valid, args.eval_batch_size) 32 33 34 # GPUの有無の確認 35 have_gpu = context.num_gpus() > 0 36 37 # デバイスの割り当て(GPUデバイスが検出されない場合は使わない) 38 with tf.device("/device:GPU:0" if have_gpu else None): 39 # 学習係数 40 # 学習係数は変化するのでVariableで定義 41 learning_rate = tf.Variable(args.learning_rate, name="learning_rate") 42 sys.stderr.write("learning_rate=%f\n" % learning_rate.numpy()) 43 # EncDecADクラスのインスタンス作成 44 model = EncDecAD(args.hidden_dim, args.training) 45 # オプティマイザーオブジェクトの作成 46 optimizer = tf.keras.optimizers.Adam(learning_rate) 47 48 best_loss = None 49 cnt = 0 50 evaluation_loss_ = [] 51 training_loss_ = [] 52 # エポック毎のループ 53 for _ in range(args.epoch): 54 # 訓練データ 55 training_loss_.append(train(model, optimizer, train_data, args.seq_len, args.clip)) 56 # 検証データ 57 eval_loss, l_scores, outputs, evaluation_loss = evaluate(args, model, test_data, train_data) 58 evaluation_loss_.append(evaluation_loss) 59 # テストデータを使った評価での損失が下がった場合 60 if not best_loss or eval_loss < best_loss: 61 best_loss = eval_loss 62 cnt = 0 63 # テストデータを使った評価での損失が下がらなかった場合 64 else: 65 cnt += 1 66 # 6回連続で下がらなかった場合 67 if cnt>5: 68 # 学習係数を1/1.2倍する 69 learning_rate.assign(max(learning_rate/1.2, .002)) 70 sys.stderr.write( 71 "eval_loss did not reduce in this epoch, " 72 "changing learning rate to %f for the next epoch\n" % 73 learning_rate.numpy()) 74 cnt = 0 75 76###########ここでモデルの保存###################################### 77 # save the model 78 tf.saved_model.save(model, "/tmp/saved_model/model") 79 80 #model._set_inputs(train_data[0, :]) 81 #tf.keras.experimental.export_saved_model(model, "path_to_my_model", serving_only=True) 82 # save the weights 83 #model.save_weights('path_to_my_model.h5') 84 85 # モデルの定義 86 #model = EncDecAD(args.hidden_dim, args.training) 87#############ここで保存済みの重みの読み込み############################### 88 # 学習済みの重みの読み込み 89 new_model = tf.saved_model.load("/tmp/saved_model/model") 90 91 # 検証データ 92 outputs, l_scores = evaluate_(args, new_model, test_data, train_data) 93 94 scores = l_scores[0] 95 for score in l_scores[1:]: 96 scores = np.concatenate((scores, score)) 97
該当エラー
TypeError Traceback (most recent call last)
<ipython-input-3-97c0d97a5478> in <module>
~~~割愛~~~
TypeError: call() missing 1 required positional argument: 'state'
回答1件
あなたの回答
tips
プレビュー