Tensorflowでload_modelが上手く行かずpredictがNaNになる

GCPでkerasを回した後、ローカルのMacbookでpredictしたら全ての値がNaNになってしまった。

model.summary()は元のモデルと同じ構造になっているし、model.weightでテンソルの値を見ても一致していたので、原因が全然わからなかった。

擬似コードを書くとしたらこんな感じ。

# train on GCP
ModelCheckpoint('save_name.h5',save_best_only=True, save_weights_only=False)
model.fit(...)


# predict on local Macbook
model = tf.keras.models.load_model('save_name.h5')
model.predict(image)

Tensorflowのチュートリアルを見てみる。

モデルの保存と復元  |  TensorFlow Core

バージョン2からSavedModelフォーマットで保存されるようだ。

デフォルトではSavedModelだが、今回はH5ファイルで保存してしまっていたのでチュートリアル通り.H5の拡張子を外して再挑戦してみたが、predictはNaNになる。

ModelCheckpointで保存する時の拡張子を.ckptにしてみても上手く行かない。

load_modelの引数を確認してみる。

tf.keras.models.load_model(filepath, custom_objects=None, compile=True, options=None)

https://www.tensorflow.org/api_docs/python/tf/keras/models/load_model?hl=ja

loadした後にcompileが必要なのかな?と思ってcompile=Trueにしてみても上手く行かない。

丸一日かけて調べてもわからず、ダメ元でGCPでload_modelしてpredictしてみたら何とNaNにならなかった。

GPUで学習したモデルはGPUじゃないとpredict出来ないのか?

FP16で計算したモデルはGPUがないマシンだとpredict出来ないのか?

コードはローカルマシンで使ったものから1行も変えずにGCPで上手く動いてしまったので原因ははっきりせず、modelのsaveとloadに関して謎が深まるばかりであった…。

参考

Kerasモデルの保存と読み込み  |  TensorFlow Core
SavedModel 形式の使用  |  TensorFlow Core
モデルの保存と復元  |  TensorFlow Core
tf.keras.models.load_model  |  TensorFlow Core v2.5.0
Loads a model saved via model.save().

コメント

タイトルとURLをコピーしました