質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2048閲覧

深層学習モデルの保存ができません。

oshikosan

総合スコア4

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/03/21 11:09

編集2020/03/21 11:15

参考書に記載されていた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'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/03/21 11:38

エラーが発生しているのはどのコード(行)ですか? エラーメッセージを見ると引数が足りないとのエラーのようですが?
oshikosan

2020/03/22 03:51 編集

tf.saved_model.save(model, "/tmp/saved_model/model")の部分です。 エラーメッセージの最終文を載せます。 他サイトを確認したところ、この手のエラーは「callというメソッドに渡す引数(通常、クラスのインスタンス自身を渡すらしい)が正しく渡されていないためにおこるエラー」という風に書いてありました。 555 layer_call = _get_layer_call_method(layer) 556 def call_and_return_conditional_losses(inputs, *args, **kwargs): --> 557 return layer_call(inputs, *args, **kwargs), layer.get_losses_for(inputs) 558 return _create_call_fn_decorator(layer, call_and_return_conditional_losses) 559 TypeError: call() missing 1 required positional argument: 'state'
meg_

2020/03/22 05:26

あなたが書いたコードのどこでエラーは発生しているのでしょうか?(上記ではエラー発生箇所が特定できません。) 情報は質問に追記してくださいね。
guest

回答1

0

自己解決

モデルを保存するのではなく、使用した「重み」を保存し、その後再定義したモデルに保存した重みをロードすることで解決することができました。
今回自分が使用したモデルはSequentialモデルではなくpythonのクラス継承を用いて構築されたモデルであったため、公式ドキュメント等で記されているような「一行コードを追加すれば簡単にモデルの保存が行える」という方法は通用しなかったようです。
回答、コメントいただいた皆様ありがとうございました。

投稿2020/04/26 03:16

oshikosan

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問