TensorFlow中的saved_model模块用于生成冻结图文件,并且saved_model模块封装了平常用的Saver类。与Saver类不同的是,saved_model模块生成的模型文件集成了打标签的操作,可以更方便地部署在生产环境中。
关于为什么要用saved_model模块,这篇文章讲得挺好的。请点击这里
一个saved_model对象可以存储一个或多个MetaGraphDef。那什么时候需要多个MetaGraphDef呢?也许你想同时保存模型的CPU版本和GPU版本,或者你想同时保存模型的开发版本和生产版本。这个时候你就可以用tag(标签)来区分它们了。在加载模型的时候能根据tag标签来加载不同的MetaGraphDef。
TensorFlow中的saved_model模块可以给MetaGraphDef添加多个签名(signature)。每个签名的的结构都由输入节点、输出节点、名字3部分组成。并且,输入节点,输出节点的名字可以任意指定。
1.导出带有签名的模型文件
假设之前训练了一个模型,让模型在一组混乱的数据中找到y≈2x的规律。其中
(1)用saved_model模块的builder.SavedModelBuilder类实例化一个builder对象。
(2)构建签名的输入节点inputs。该输入节点的名字为“input_x”。该名字是模型文件中输入节点的名字(可以任意取名)。
(3)构建标签的输出节点outputs。该输出节点的名字为“output”。
(4)调用build_signature_def函数,并将输入节点、输出节点和名字(sig_name)传入,生成一个签名对象。
(5)用builder对象的add_meta_graph_and_variables方法将签名加入到模型中。
(6)调用builder对象的save方法导出带有签名的模型文件。
代码如下:
from tensorflow.python.saved_model import tag_constants
#saveddir+"tfservingmodel"为模型的保存路径
builder = tf.saved_model.builder.SavedModelBuilder(savedir+'tfservingmodel')
#定义输入签名,X为输入tensor
inputs = {
'input_x': tf.saved_model.utils.build_tensor_info(X)}
#定义输出签名, z为最终需要的输出结果tensor
outputs = {
'output' : tf.saved_model.utils.