1. 程式人生 > >TensorFlow 到底有幾種模型格式?

TensorFlow 到底有幾種模型格式?

用過 TensorFlow 時間較長的同學可能都發現了 TensorFlow 支援多種模型格式,但這些格式都有什麼區別?怎樣互相轉換?今天我們來一一探索。

1. CheckPoint(*.ckpt)

在訓練 TensorFlow 模型時,每迭代若干輪需要儲存一次權值到磁碟,稱為“checkpoint”,如下圖所示:

這種格式檔案是由 tf.train.Saver() 物件呼叫 saver.save() 生成的,只包含若干 Variables 物件序列化後的資料,不包含圖結構,所以只給 checkpoint 模型不提供程式碼是無法重新構建計算圖的。

載入 checkpoint 時,呼叫 saver.restore(session, checkpoint_path)。

2. GraphDef(*.pb)

這種格式檔案包含 protobuf 物件序列化後的資料,包含了計算圖,可以從中得到所有運算子(operators)的細節,也包含張量(tensors)和 Variables 定義,但不包含 Variable 的值,因此只能從中恢復計算圖,但一些訓練的權值仍需要從 checkpoint 中恢復。下面程式碼實現了利用 *.pb 檔案構建計算圖:

TensorFlow 一些例程中用到 *.pb 檔案作為預訓練模型,這和上面 GraphDef 格式稍有不同,屬於凍結(Frozen)後的 GraphDef 檔案,簡稱 FrozenGraphDef 格式。這種檔案格式不包含 Variables 節點。將 GraphDef 中所有 Variable 節點轉換為常量(其值從 checkpoint 獲取),就變為 FrozenGraphDef 格式。程式碼可以參考 tensorflow/python/tools/freeze_graph.py

*.pb 為二進位制檔案,實際上 protobuf 也支援文字格式(*.pbtxt),但包含權值時文字格式會佔用大量磁碟空間,一般不用。

3. SavedModel

在使用 TensorFlow Serving 時,會用到這種格式的模型。該格式為 GraphDef 和 CheckPoint 的結合體,另外還有標記模型輸入和輸出引數的 SignatureDef。從 SavedModel 中可以提取 GraphDef 和 CheckPoint 物件。

SavedModel 目錄結構如下:

其中 saved_model.pb(或 saved_model.pbtxt)包含使用 MetaGraphDef protobuf 物件定義的計算圖;assets 包含附加檔案;variables 目錄包含 tf.train.Saver() 物件呼叫 save() API 生成的檔案。

以下程式碼實現了儲存 SavedModel:

載入 SavedModel:

更多細節可以參考 tensorflow/python/saved_model/README.md。

4. 小結

本文總結了 TensorFlow 常見模型格式和載入、儲存方法。部署線上服務(Serving)時官方推薦使用 SavedModel 格式,而部署到手機等移動端的模型一般使用 FrozenGraphDef 格式(最近推出的 TensorFlow Lite 也有專門的輕量級模型格式 *.lite,和 FrozenGraphDef 十分類似)。這些格式之間關係密切,可以使用 TensorFlow 提供的 API 來互相轉換