TensorFlow 到底有幾種模型格式?
-
CheckPoint(*.ckpt)
在訓(xùn)練 TensorFlow 模型時(shí),每迭代若干輪需要保存一次權(quán)值到磁盤,稱為“checkpoint”,如下圖所示:
image
這種格式文件是由 tf.train.Saver() 對(duì)象調(diào)用 saver.save() 生成的,只包含若干 Variables 對(duì)象序列化后的數(shù)據(jù),不包含圖結(jié)構(gòu),所以只給 checkpoint 模型不提供代碼是無(wú)法重新構(gòu)建計(jì)算圖的。
載入 checkpoint 時(shí),調(diào)用 saver.restore(session, checkpoint_path)。
-
GraphDef(*.pb)
這種格式文件包含 protobuf 對(duì)象序列化后的數(shù)據(jù),包含了計(jì)算圖,可以從中得到所有運(yùn)算(operators)的細(xì)節(jié),也包含張量(tensors)和 Variables 定義,但不包含 Variable 的值,因此只能從中恢復(fù)計(jì)算圖,但一些訓(xùn)練的權(quán)值仍需要從 checkpoint 中恢復(fù)。下面代碼實(shí)現(xiàn)了利用 *.pb 文件構(gòu)建計(jì)算圖:
image
TensorFlow 一些例程中用到 *.pb 文件作為預(yù)訓(xùn)練模型,這和上面 GraphDef 格式稍有不同,屬于凍結(jié)(Frozen)后的 GraphDef 文件,簡(jiǎn)稱 FrozenGraphDef 格式。這種文件格式不包含 Variables 節(jié)點(diǎn)。將 GraphDef 中所有 Variable 節(jié)點(diǎn)轉(zhuǎn)換為常量(其值從 checkpoint 獲?。妥?yōu)?FrozenGraphDef 格式。代碼可以參考 tensorflow/python/tools/freeze_graph.py
.pb 為二進(jìn)制文件,實(shí)際上 protobuf 也支持文本格式(.pbtxt),但包含權(quán)值時(shí)文本格式會(huì)占用大量磁盤空間,一般不用。
3. SavedModel
在使用 TensorFlow Serving 時(shí),會(huì)用到這種格式的模型。該格式為 GraphDef 和 CheckPoint 的結(jié)合體,另外還有標(biāo)記模型輸入和輸出參數(shù)的 SignatureDef。從 SavedModel 中可以提取 GraphDef 和 CheckPoint 對(duì)象。
SavedModel 目錄結(jié)構(gòu)如下:
其中 saved_model.pb(或 saved_model.pbtxt)包含使用 MetaGraphDef protobuf 對(duì)象定義的計(jì)算圖;assets 包含附加文件;variables 目錄包含 tf.train.Saver() 對(duì)象調(diào)用 save() API 生成的文件。
以下代碼實(shí)現(xiàn)了保存 SavedModel:
載入 SavedModel:
更多細(xì)節(jié)可以參考 tensorflow/python/saved_model/README.md。
https://mp.weixin.qq.com/s/GDfOBG-DF5HnlOZXSyf0JQ