简介
TensorFlow 支持多种模型格式,但这些格式都有什么区别?
名词
- variable: 变量
- graph: 计算图
- MetaGraph
包含Graph和metadata信息
protobuf
全称Protocol Buffers,是Google开源的一个语言无关、平台无关 的序列化协议,用于不同应用或进程之间的通信。
- 优势: 文本文件结构跟xml,json等文件结构类似。优点是体积更小、解析速度更快
- 格式: 支持binary、text两种格式
综述
saved model | meta graph | graph | frozen graph | web model | ckp | |
---|---|---|---|---|---|---|
简介 | 打包graph和checkpoint到一个文件,并优化,便于部署 | |||||
类 | SavedModel | MetaGraphDef | GraphDef | GraphDef | ||
包含内容 | meta graph | GraphDef, MetaInfoDef, SaverDef, CollectionDef | GraphDef | GraphDef + value - variable | ||
序列化格式 | protobuf | protobuf | protobuf | protobuf | ||
文件后缀 | .pb .pbtxt | .meta .meta.txt | .pb .pbtxt | .pb .pbtxt | ||
文件示例 | .pbtxt | .meta.txt | .pbtxt | .pbtxt | ||
API-save | SavedModelBuilder.save | Saver.save或export_meta_graph | write_graph | freeze_graph.py | ||
API-load | saved_model.loader.load | import_meta_graph |
模型文件相关
- checkpoint (.ckpt):
variable
的序列化存储,常用于保存和还原模型参数。保存方式是变量name–>value的映射- 缺陷:序列化内容与创建的代码相关,因此在跨语言时通常不采用这种格式
- SavedModel: 同时包含
variable
、graph
、graph’s metadataCheckpoints
is a format dependent on the code that created the model(是指和模型版本相关吗?还是语言种类?). 不包含graphSavedModel
is a format independent of the code that created the model. 包含graph
- meta graph:
- 类: MetaGraphDef ,包含
MetaInfoDef
、GraphDef
、SaverDef
、CollectionDef
- 序列化存储格式: protobuf,
.meta
文件 - 示例
- 类: MetaGraphDef ,包含
- GraphDef (.pb)
- Graph对象的protobuf保存形式为GraphDef对象
- 示例
- frozen graph:
- freeze_graph.py的操作: 将 GraphDef 中所有 Variable 节点转换为常量。
FrozenGraphDef:
graph和variable分别存储在不同的文件,通常不利于部署到产品。
tensorflow提供freeze_graph.py脚本将graph定义和checkpoint中的变量打包到一个文件。 - 序列化存储格式: protobuf, 文件
- 示例
- freeze_graph.py的操作: 将 GraphDef 中所有 Variable 节点转换为常量。
- TensorFlow Lite model (.tflite): 轻量级模型格式
*.lite
,和 FrozenGraphDef 十分类似
部署在线服务(Serving)时官方推荐使用 SavedModel 格式,而部署到手机等移动端的模型一般使用 FrozenGraphDef 格式
tensorflow常用的模型文件,save & restore
- SavedModel
- 内容: variables, graph, graph’s metadata
- 用途: 常用与python接口
- 文件: 格式为
1 | assets/ |
-Keras h5 keras模型,格式为.h5
- Frozen Model
- 用途: 常用于C++、Java的接口,移动端。
- 文件:
Frozen Model
包含一个.pb
文件,其中包括了所有网络结构以及所有模型参数。
- tensorflowjs
- 用途: web格式,
- 文件:
.pb
.json
(方便web读取),等格式
- Tensorflow Hub module 实验阶段,尚未成熟
- 用途: web-friendly format
- Session Bundle 已弃用
Tensorflow 保存模型的几种方式:
- tf.train.Saver->save:
- 官方文档: save and restore variables to and from checkpoints
- 大白话: 保存变量(checkpoints),但不保存graph,即
MetaGraphDef
。所以只给 checkpoint 模型不提供代码是无法重新构建计算图的,不能直接用于serving - restore: saver.restore 或 saver.recover_last_checkpoints
- 完整示例:save_and_restore_variables | tensorflow
- tf.train.export_meta_graph与tf.train.Saver->export_meta_graph
- 官方文档: exports the graph, saver, and collection objects into
MetaGraphDef
protocol buffer - 大白话:
- restore: tf.train.import_meta_graph
- 完整示例: Exporting and Importing a MetaGraph | tensorflow
- 官方文档: exports the graph, saver, and collection objects into
- SavedModelBuilder: 用于serving
- 官方文档: Builds the SavedModel protocol buffer. Meta graph must be saved with variables.
- 大白话: 保存
SavedModel
,同时包含graph和variable - restore: tf.saved_model.loader.load 根据tag加载
SavedModel
- Exporter: 用于serving
checkpoint
典型的tensorflow模型包含4种文件
- graph.pbtxt:
- model.ckpt.meta: 包含全部graph信息。这是一个序列化的MetaGraphDef protocol buffer,包含数据流、变量的annotations、input pipelines,以及其他相关信息
- model.ckpt.data-0000-of-00001: 包含所有变量的值(weights, biases, placeholders,gradients, hyper-parameters etc).
- model.ckpt.index: metadata. [ It’s an immutable table(tensoflow::table::Table). Each key is a name of a Tensor and it’s value is a serialized BundleEntryProto. Each BundleEntryProto describes the metadata of a Tensor]
- checkpoint: All checkpoint information
疑问graph.pbtxt 与model.ckpt.meta的区别。答:基本是一样的,都包含
SavedModel
SavedModel用于保存和加载模型(variables, graph, graph’s
metadata)。这是一种语言无关的、可复原的序列化格式。
1 | |--save-model.pb |
.pb
与.pbtxt
都是SavedModel的protobuf存储格式,区别是前者是二进制文件,后者是txt文件(方便阅读)。来源
从 SavedModel 中可以提取 GraphDef 和 CheckPoint 对象。
GraphDef的缺陷是不包含graph,的缺陷是单靠graph无法还原整个模型计算
save & restore
常用的API
1 | builder = tf.saved_model.builder.SavedModelBuilder(export_dir) |
load graph using .meta file and restore weights inside a session). Convert the graph to graph_def.
1 | saver = tf.train.import_meta_graph('./dogs-cats-model.meta', clear_devices=True) |
参考: https://www.tensorflow.org/guide/saved_model#save_and_restore_models
Frozen Model/Graph
TensorFlow 一些例程中用到 *.pb 文件作为预训练模型,这和上面 GraphDef 格式稍有不同,
属于冻结(Frozen)后的 GraphDef 文件,简称 FrozenGraphDef 格式。这种文件格式不包含 Variables 节点。
将 GraphDef 中所有 Variable 节点转换为常量(其值从 checkpoint 获取),就变为 FrozenGraphDef 格式。代码可以参考 tensorflow/python/tools/freeze_graph.py
什么是Frozen Model/Graph?为什么要Freeze?
Tensorflow的SavedModel
文件包含graph、模型参数、梯度信息(用于训练时的BP)等。然而,在部署环境下一般用不到梯度信息,也就没必要加载所有的SavedModel文件。
Freezing
过程会对SavedModel
进行过滤,只包含必要的信息(graph, weights etc) ,并打包到一个文件便于应用。
Freezing
过程通常会去除掉SavedModel
中不必要的meta-data、梯度,以及不必要的训练参数,并打包为.pb
文件。这个文件就叫做Frozen Model/Graph
怎样Freeze?
有两种方式:
Keras h5
Tensorflow Hub module
tensorflowjs
格式转换
- https://www.tensorflow.org/mobile/tflite/devguide#2_convert_the_model_format
- https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/graph_transforms
saver文件
load the checkpoints
1 | saver = tf.train.import_meta_graph('model-number.meta') |
扩展阅读
模型文件相关
frozen-model相关
- Freeze Tensorflow models and serve on web
SavedModelBuilder相关
- Serving a TensorFlow Model
tensorflowjs相关
tfjs-converter
跨语言相关
ic)
tensorflowjs相关
tfjs-converter