何が起きた
わい「GWやし趣味開発しよ。さいつよモデル作るんや。」
わい「もうTensorFlowも2.16か~。せや、お古のモデル、読み込んでみよ。」
TensorFlow・Keras「お前のモデル古すぎワロタ。時代は.keras 形式やで。出直せや。」
結論からいうと、
- TensorFlow2.16からKeras3が使われるようになった
- Keras3でsaved_modelをtf.keras.model.load_modelで読み込めなくなった
- 解決には、別のAPIを使うかKeras2を使う必要がある(後でKeras2を使う方法を詳述)
モデルの読み込み以外でも参考になると思い、筆を執りました。
詳しい設定・エラーメッセージはこちら。
設定
項目 | 値 |
---|---|
モデル作成時TensorFlowバージョン | 2.8.2 |
モデル作成時Kerasバージョン | 2.8.0 |
モデル形式 | keras.Model.saveでsave_format="tf"として保存したsaved model形式 |
読み込み時TensorFlowバージョン | 2.16.1 |
読み込み時Kerasバージョン | 3.0.5 |
読み込み方法 | tf.keras.models.load_model |
エラーメッセージ
Traceback (most recent call last):
File {ファイルパス}, line {行数}, in <module>
m = tf.keras.models.load_model({モデルのパス})
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.11/dist-packages/keras/src/saving/saving_api.py", line 191, in load_model
raise ValueError(
ValueError: File format not supported: filepath={モデルのパス}. Keras 3 only supports V3 `.keras` files and legacy H5 format files (`.h5` extension). Note that the legacy SavedModel format is not supported by `load_model()` in Keras 3. In order to reload a TensorFlow SavedModel as an inference-only layer in Keras 3, use `keras.layers.TFSMLayer({モデルのパス}, call_endpoint='serving_default')` (note that your `call_endpoint` might have a different name).
解決策
解決には、別のAPIを使うかKeras2を使うアプローチがあります。
別のAPIを使う方法は、エラーメッセージに従ってTFSMLayerを使う方法や、tf.saved_model.loadを使う方法です。ただ、今回試したモデルでは上手くいかなかったので、これは諦めました。
ということで、Keras2を使う方法です。
Keras2を使う方法
以下のリリースノートの「To continue using Keras 2.0, do the following.」のくだりを参考にしました。
リリースノートに、以下のようにtf-kerasを介してKeras2を使う方法が説明されています。
- (共通) tf-kerasをインストール(pip install tf-keras~=2.16等)
- (方法1)環境変数の設定(TF_USE_LEGACY_KERAS=1)を行って実行する
- (方法2)tf.keras の代わりに import tf_keras してtf_kerasを用いる
方法1も方法2もtf-kerasのインストールが必要です。方法1は、環境変数でtf.kerasの実体をtf_kerasに変更している感じです。
以上。