0%

tensorflow中的几种模型文件

简介

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: 同时包含variablegraph、graph’s metadata
    • Checkpoints is a format dependent on the code that created the model(是指和模型版本相关吗?还是语言种类?). 不包含graph
    • SavedModel is a format independent of the code that created the model. 包含graph
  • meta graph:
    • 类: MetaGraphDef ,包含MetaInfoDefGraphDefSaverDefCollectionDef
    • 序列化存储格式: protobuf, .meta文件
    • 示例
  • GraphDef (.pb)
    • Graph对象的protobuf保存形式为GraphDef对象
    • 示例
  • frozen graph:
    • freeze_graph.py的操作: 将 GraphDef 中所有 Variable 节点转换为常量。
      FrozenGraphDef:
      graph和variable分别存储在不同的文件,通常不利于部署到产品。
      tensorflow提供freeze_graph.py脚本将graph定义和checkpoint中的变量打包到一个文件。
    • 序列化存储格式: protobuf, 文件
      • 示例
  • TensorFlow Lite model (.tflite): 轻量级模型格式 *.lite,和 FrozenGraphDef 十分类似

部署在线服务(Serving)时官方推荐使用 SavedModel 格式,而部署到手机等移动端的模型一般使用 FrozenGraphDef 格式

tensorflow常用的模型文件,save & restore

  • SavedModel
    • 内容: variables, graph, graph’s metadata
    • 用途: 常用与python接口
    • 文件: 格式为
1
2
3
4
5
6
7
assets/
assets.extra/
variables/
variables.data-?????-of-?????
variables.index
saved_model.pb

-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.restoresaver.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
  • 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
2
3
4
|--save-model.pb
|--variable
|-- |--variables.data-00000-of-00001
|-- |--variables.index

.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
2
3
4
5
saver = tf.train.import_meta_graph('./dogs-cats-model.meta', clear_devices=True)
graph = tf.get_default_graph()
input_graph_def = graph.as_graph_def()
sess = tf.Session()
saver.restore(sess, "./dogs-cats-model")

参考: 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
2
saver = tf.train.import_meta_graph('model-number.meta')
saver.restore(sess, tf.train.latest_checkpoint('./'))

扩展阅读

模型文件相关

frozen-model相关

  • Freeze Tensorflow models and serve on web

SavedModelBuilder相关

  • Serving a TensorFlow Model

tensorflowjs相关

tfjs-converter

跨语言相关

ic)

tensorflowjs相关

tfjs-converter

跨语言相关