web-dev-qa-db-ja.com

保存されたオプティマイザの読み込み中にエラーが発生しました。ケラスpythonラズベリー

Linux 64マシンでkerasシーケンシャルモデルをトレーニングし、.h5ファイルに保存しました。

このPCでモデルをロードして、問題なく予測を行うことができます。

現在、keras、tensorflow、h5py、python3をインストールしたRaspberry Pi 3に予測を実装しています。

モデルをロードするとき

from keras.models import load_model
model = load_model('model-0.6358.h5')

、私は得ています:

usr/lib/python3.4/importlib/_bootstrap.py:321: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
return f(*args, **kwds)

/usr/local/lib/python3.4/dist-packages/keras/models.py:291: UserWarning: Error in loading the saved optimizer state. As a result, your model is starting with a freshly initialized optimizer.
warnings.warn('Error in loading the saved optimizer '

しかし...それは正しく予測しているように見えます。

その警告メッセージを回避するにはどうすればよいですか?

7
Mquinteiro

_load_model_は、まず保存された重みを使用して保存されたモデルアーキテクチャを構築し、次に保存された重みを使用して保存されたオプティマイザを構築しようとします。

ただし、保存されたオプティマイザの重みの形状と、ロードされたモデルのアーキテクチャに基づいてオプティマイザが予期している重みの形状の間に不一致があるため、エラーメッセージが表示されます。

_trainable=False_に設定された内部サブモデルを持つモデルを保存して再ロードしようとしたときに、Keras 2.1.4を使用してこの問題に遭遇しました。この情報はモデルを保存するときに保持されないようです。そのため、内部サブモデルを再インスタンス化した後、_trainable=True_に設定され、オプティマイザは実際に保存されるよりも多くの保存された重みを期待します。これがあなたのケースの問題である可能性がある場合、私は this bug-report で回避策を説明しました:

  1. すべての内部モデルレイヤーのトレーニング可能性を明示的に設定する
  2. 保存する直前に、すべてのレイヤーのトレーニング可能性フラグを、モデルのコンパイル時に持っていた状態に設定する必要があります

警告を取り除き、保存後にオプティマイザが必要ない場合は、オプティマイザなしでモデルを保存することもできます。model.save(filename, include_optimizer=False)を使用します

14
KiraMichiru