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 v2.16.1
Loads a model saved via model.save().
コメント