1. 程式人生 > 其它 >Keras生成的.h5模型轉換成TensorFlow的固化.pb模型

Keras生成的.h5模型轉換成TensorFlow的固化.pb模型

技術標籤:tensorflowpython深度學習

TensorFlow版本是1.15.0,沒有用2.0版本,用2.0版本會有一些問題,我參考的是https://github.com/amir-abdi/keras_to_tensorflow,直接執行會報一些錯誤,我遇到的錯誤有很多,解決之後就能生成固化模型了

報錯1:tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized val

原因:sess沒有初始化

解決方式:在sess = K.get_session()後加上初始化程式碼,如下所示

sess = K.get_session()
######## 初始化sess
init = tf.global_variables_initializer()
sess.run(init)
報錯2:ImportError: Could not find 'cudart64_100.dll' ,也會出現類似的錯誤,找不到dll檔案
原因:缺少cudart64_100.dll檔案
解決方式:下載dll檔案放到 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin路徑下,這是我的路徑,根據自己cuda版本不同放到對應的bin裡就可以。

報錯3:ValueError: Unknown initializer: GlorotUniform 
原因:載入模型方法不一致的問題,訓練儲存模型時候用哪種方式,載入的時候也需要用相同的方式,
解決方式:修改load模型的方法,如下所示,可以參考keras文件
https://keras.io/getting_started/faq/
中What are my options for saving models?的回答
from keras.models import load_model
# 將上面的這句話替換成下面的,即可。
from tensorflow.keras.models import load_model

# 在執行此句就不會報錯了
model = load_model('lstm_model.h5')
報錯4:由於檔案中自定義了函式load_model,在解決報錯3後,需要修改了檔案中的自定義函式名稱,如果不修改會有死迴圈出現
解決方式:修改自定義函式名稱,我的修改如下所示
# 原檔案函式名稱是load_model,我修改為load_model_new,避免與報錯3的載入模型函式衝突
def load_model_new(input_model_path, input_json_path=None, input_yaml_path=None):
    print(input_model_path,"input_model_path")
    if not Path(input_model_path).exists():
        raise FileNotFoundError(
            'Model file `{}` does not exist.'.format(input_model_path))
    try:
        # model = keras.models.load_model(input_model_path, compile=False)
        model = load_model(input_model_path)
        return model
修改完成後,在目錄下執行如下命令,input_model為h5模型路徑 ,output_model=輸出模型路徑
python keras_to_tensorflow.py --input_model="model.h5" --output_model="model.pb"