2019年7月29日 星期一

有關於 ValueError: Unknown initializer: GlorotUniform 的錯誤排解方案

使用 HDF5 的 keras weight model 時,由於跨電腦設備讀取、不同於訓練的專案導致發生: ValueError: Unknown initializer: GlorotUniform 的錯誤。  以下為解決方案之筆記。



於專案中發生此錯誤時,最主要的幾個檢查點:

  • 訓練電腦上的 Keras 版本與執行 load_model 的電腦之 keras 版本是否匹配。
  • 檢查訓練電腦上之使用 keras 的方式,是否是 tensorflow 自帶的 keras 還是單純的 keras。

第一種情況,不需要特別解釋,可自行使用 pip 或 conda 去 check 套件版本即可;而第二種情況,需要去 trace code,先看錯誤的 code 在哪行開始 load:


然後,從程式碼來了解 load_model 是從哪個模組引入的:

from keras.models import load_model
...

# loading pre trained model
model = keras.models.load_model('cnn_model/digit_classifier.h5')

從這裡可以發現,原本 load_model 使用的模組是獨立的 keras。

再回去看訓練機器上的 keras 原來是使用 tensorflow 自帶的:
from tensorflow import keras
...

model = keras.Sequential()
...
model.fit(.....)

於是修正這個問題,要從 load_model 那一端的電腦把程式碼換成 tensorflow 自帶的 keras 去讀取,就可以解決這個問題。
from tensorflow import keras
...

# loading pre trained model
model = keras.models.load_model('cnn_model/digit_classifier.h5')

Reference:
https://github.com/keras-team/keras/issues/3867
https://keras.io/zh/initializers/
https://github.com/tensorflow/tfjs/issues/798
https://stackoverflow.com/questions/53183865/unknown-initializer-glorotuniform-when-loading-keras-model
https://github.com/keras-team/keras/pull/8693
https://stackoverflow.com/questions/48268563/keras-load-model-returning-unexpected-keyword-argument-passed-to-optimizer-amsg

沒有留言:

張貼留言

© ERIC RILEY , 自由無須告知轉貼
Background Japanese Sayagata by Olga Libby