H5轉化tflite
注意事項:
1.H5文件必須為整個模型(包含權重,模型結構,配置信息),若是權值h5文件,會加載不出模型
模型訓練時,ModelCheckpoint設置參數save_weights_only=False;
- save_weights_only : 如果為 True,則僅保存模型的權重 ( model.save_weights(filepath)),否則保存完整模型 ( model.save(filepath))
參考鏈接:https://blog.csdn.net/leviopku/article/details/86612293
https://blog.csdn.net/weixin_41770169/article/details/85697281
http://www.cppcns.com/jiaoben/python/314093.html
https://blog.csdn.net/u011529752/article/details/113921568?spm=1001.2014.3001.5501
轉換步驟:
報錯1:ValueError: Unknown activation function:relu6
原因:新版本的keras把relu6改掉了,找不到該方法
解決方法:
自己定義一個relu6;
報錯2:TypeError: Unexpected keyword argument passed to optimizer: learning_rate
原因:由於在新版本的keras中(指大於等於2.3.0版本),將原來的 lr 這一參數重命名為 leraning_rate,因此將 leraning_rate 重新改為 lr 即可解決報錯問題
解決方法:
在模型訓練時需根據keras版本定義學習率:
解決方法2:
若上述方法不能解決,則升級tensorflow版本至2.0;
並修改使用tf1.0版本的API:
converter = tf.compat.v1.lite.TFLiteConverter.from_keras_model_file(model_file=filepath);
H5模型可視化:
報錯1:ValueError: Unknown activation function:relu6
原因:新版本的keras把relu6改掉了,找不到方法
解決方法:
重新定義relu6,修改如下:
報錯2:TypeError: Unexpected keyword argument passed to optimizer: learning_rate
類型錯誤:意外的關鍵字參數傳遞給優化器:learning_rate
原因:
Keras版本不匹配,學習率命名 keras2.2.4使用lr,keras2.3.1使用learning_rate
解決方法:
升級keras:pip install --upgrade keras==2.3.1
報錯3:OSError: `pydot` failed to call GraphViz.Please install GraphViz (https://www.graphviz.org/) and ensure that its executables are in the $PATH.
原因:
解決方法:(仍待解決)
pip install pydot
pip install pydotplus
brew install graphviz
Ps:
關於Adam:
Keras保存模型:
參考鏈接:https://blog.csdn.net/leviopku/article/details/86612293
1.保存整個模型:model.save(filepath)將Keras模型和權重保存在一個HDF5文件中,該文件將包含:
- 模型的結構
- 模型的權重
- 訓練配置(損失函數,優化器,准確率等)
- 優化器的狀態,以便於從上次訓練中斷的地方
再一次使用時可以model.load_model(filepath)載入模型;
2.保存模型結構:model.to_jason()將模型序列化保存為json文件,里面記錄了網絡的整體結構, 各個層的參數設置等信息. 將json字符串保存到文件.
3.保存模型權重:經過調參網絡的輸出精度比較滿意后,可以將訓練好的網絡權重參數保存下來,可通過下面的代碼利用HDF5進行保存:
model.save_weights(‘model_weights.h5’)
使用時加載模型:
model.load_weights(‘model_weights.h5’)
如果需要加載權重到不同的網絡結構(有些層一樣)中,例如fine-tune或transfer-learning,可以通過層名字來加載模型:
model.load_weights('my_model_weights.h5', by_name=True)
因此建模時最好給每個層定義名字。