tensorflow中的模型常常是protobuf格式,這種格式既可以是二進制也可以是文本。keras模型保存和加載與tensorflow不同,keras中的模型保存和加載往往是保存成hdf5格式。
keras的模型保存分為多種情況。
一、不保存模型只顯示大概結構
-
model.summary()
這個函數會打印模型結構,但是僅僅是打印到控制台。 -
keras.utils.plot_model()
使用graphviz中的dot.exe生成網絡結構拓撲圖
二、保存模型結構
-
keras.models.Model對象的to_json,to_yaml
只保存模型結構,加載時使用keras.models.model_from_json(),keras.models.model_from_yaml() -
keras.model.get_config()返回文本形式的配置
使用keras.model.model_from_config可以加載模型。
三、保存全部結構
keras.core.saving.py這個文件十分重要,keras的模型保存、加載都需要這個文件。
但是不建議直接使用這個文件,因為keras中的Model對象和models模塊會調用這個文件。
keras.core包下的內容一般供內部使用,不暴露給使用者。
Model對象提供了save()和save_wights()兩個方法。save()方法保存了三種東西:
- 模型結構
- 模型參數
- 優化器參數
其中優化器參數是給優化器用的,用於繼續訓練模型。有些優化器比如AdamOptimizer需要根據訓練步數來調整不同參數的學習速率,這樣在分階段訓練模型時才能夠保證正確。save()函數保存結果就是一個hdf5文件,不像tensorflow一下子保存好多種文件。tensorflow把模型結構和權重分開保存,目的是多個權重文件可以共用一個模型結構文件,但是模型結構文件通常非常小,所占空間遠遠小於參數所占空間。
Model對象的save_weights()方法只保存了模型參數而沒有保存模型結構,它的保存格式也是hdf5。它保存的數據不能用於繼續訓練模型。
Model實例的save()方法有一個等價方式:使用models.save_model()。
對於使用save()方法保存的文件,可以使用models.load_model()進行加載,此函數直接返回一個Model對象。因為save()方法保存了模型的全部內容,所以可以直接“無中生有”創造一個模型。
對於使用save_weights()方法保存的文件,只能通過Model對象提供的load_weights()方法加載模型權重。 並且,在加載模型權重之前,必須把網絡結構定義好,並且模型的各個層的名稱必須與保存模型權重時的各個層保持一致。