辨析tensorflow模型存储形式:checkpoint、graphdef、savedmodel、frezzemodel

在tensorflow中模型信息的保存主要有四种文件形式:

1、checkpoint

在训练 TensorFlow 模型时,每迭代若干轮需要保存一次权值到磁盘,称为“checkpoint”。

 

这种格式文件是由 tf.train.Saver() 对象调用 saver.save() 生成的,只包含若干 Variables 对象序列化后的数据,不包含图结构,所以只给 checkpoint 模型,而不提供模型定义代码是无法重新构建计算图的。

说白了checkpoint就是只保存了参数值,但没有保存模型结构。

载入 checkpoint 时,调用 saver.restore(session, checkpoint_path)。

 

2、GraphDef(*.pb)

这种格式文件包含 protobuf 对象序列化后的数据,包含了计算图,可以从中得到所有运算符(operators)的细节,也包含张量(tensors)和 Variables 定义,但不包含 Variable 的值,因此只能从中恢复计算图,但一些训练的权值仍需要从 checkpoint 中恢复。

 

TensorFlow 一些例程中用到 *.pb 文件作为预训练模型,这和上面 GraphDef 格式稍有不同,属于冻结(Frozen)后的 GraphDef 文件,简称 FrozenGraphDef 格式。这种文件格式不包含 Variables 节点。将 GraphDef 中所有 Variable 节点转换为常量(其值从 checkpoint 获取),就变为 FrozenGraphDef 格式。代码可以参考 tensorflow/python/tools/freeze_graph.py

*.pb 为二进制文件,实际上 protobuf 也支持文本格式(*.pbtxt),但包含权值时文本格式会占用大量磁盘空间,一般不用。

也就是说GraphDef和checkpoint互补,只保存了模型结构没有保存变量值。

 

3、SavedModel

在使用 TensorFlow Serving 时,会用到这种格式的模型。该格式为 GraphDef 和 CheckPoint 的结合体,另外还有标记模型输入和输出参数的 SignatureDef。从 SavedModel 中可以提取 GraphDef 和 CheckPoint 对象。

 

其中 saved_model.pb(或 saved_model.pbtxt)包含使用 MetaGraphDef protobuf 对象定义的计算图;assets 包含附加文件;variables 目录包含 tf.train.Saver() 对象调用 save() API 生成的文件(checkpoint)。

 

4、FreezeModel

Tensorflow的SavedModel文件包含graph、模型参数、梯度信息(用于训练时的BP)等。然而,在部署环境下一般用不到梯度信息,也就没必要加载所有的SavedModel文件

Freezing过程会对SavedModel进行过滤,只包含必要的信息(graph, weights etc) ,并打包到一个文件便于应用。

Freezing过程通常会去除掉SavedModel中不必要的meta-data、梯度,以及不必要的训练参数,并打包为.pb文件。这个文件就叫做
Frozen Model/Graph

你可能感兴趣的:(inference,tensorflow,深度学习)