Saving and Restoring(模型存储和加载)
保存和恢复
本文档介绍了如何保存和恢复变量和模型。
保存和恢复变量
TensorFlow变量提供了表示由程序操作的共享持久状态的最佳方式。(有关详细信息,请参阅变量。)本节介绍如何保存和恢复变量。请注意,估算器会自动保存和恢复变量(在model_dir
)中。
tf.train.Saver
类提供了保存和恢复模型的方法。tf.train.Saver
构造函数为全部图形添加save
和restore
操作、或指定列表图中的变量。Saver
对象提供了运行这些操作的方法,指定检查点文件写入或读取的路径。
保存器将恢复在模型中定义的所有变量。如果您在加载模型时不知道如何构建其图形(例如,如果您正在编写通用程序来加载模型),那么请阅读本文档后面的“保存和恢复模型概述”一节。
TensorFlow将变量保存在二进制检查点文件
中,粗略地说,它将变量名称映射为张量值。
保存变量
用tf.train.Saver()
创建一个Saver
来管理模型中的所有变量。例如,以下代码片段演示了如何调用tf.train.Saver.save
方法将变量保存到检查点文件中:
# Create some variables.
v1 = tf.get_variable("v1", shape=[3], initializer = tf.zeros_initializer)
v2 = tf.get_variable("v2", shape=[5], initializer = tf.zeros_initializer)
inc_v1 = v1.assign(v1+1)
dec_v2 = v2.assign(v2-1)
# Add an op to initialize the variables.
init_op = tf.global_variables_initializer()
# Add ops to save and restore all the variables.
saver = tf.train.Saver()
# Later, launch the model, initialize the variables, do some work, and save the
# variables to disk.
with tf.Session() as sess:
sess.run(init_op)
# Do some work with the model.
inc_v1.op.run()
dec_v2.op.run()
# Save the variables to disk.
save_path = saver.save(sess, "/tmp/model.ckpt")
print("Model saved in file: %s" % save_path)
恢复变量
tf.train.Saver
对象不仅将变量保存到检查点文件,还恢复变量。请注意,当您从文件恢复变量时,您不必事先初始化它们。例如,以下片段演示如何调用tf.train.Saver.restore
方法从检查点文件恢复变量:
tf.reset_default_graph()
# Create some variables.
v1 = tf.get_variable("v1", shape=[3])
v2 = tf.get_variable("v2", shape=[5])
# Add ops to save and restore all the variables.
saver = tf.train.Saver()
# Later, launch the model, use the saver to restore variables from disk, and
# do some work with the model.
with tf.Session() as sess:
# Restore variables from disk.
saver.restore(sess, "/tmp/model.ckpt")
print("Model restored.")
# Check the values of the variables
print("v1 : %s" % v1.eval())
print("v2 : %s" % v2.eval())
选择要保存和恢复的变量
如果您没有向tf.train.Saver()
传递任何参数,那么保存器会处理图中的所有变量。每个变量都保存在创建变量时的名称下被传递。
在检查点文件中显式指定变量名称有时很有用。例如,您可能已经训练了一个模型,其中包含一个名为"weights"
您要将它的值恢复到名为"params"
的变量中。
仅保存或恢复模型使用的变量子集有时也很有用。例如,您可能已经训练了一个五层的神经网络,现在您想要训练一个具有六层的新模型,以重用五个已训练层的现有权重。您可以使用保存程序恢复前五层的权重。
您可以通过传递给tf.train.Saver()
构造函数来轻松指定要保存或加载的名称和变量:
- 变量列表(将以本身的名字存储)。
- 一个Python字典,其中键是要使用的名称,值是要管理的变量。
继续前面显示的保存/恢复示例:
tf.reset_default_graph()
# Create some variables.
v1 = tf.get_variable("v1", [3], initializer = tf.zeros_initializer)
v2 = tf.get_variable("v2", [5], initializer = tf.zeros_initializer)
# Add ops to save and restore only `v2` using the name "v2"
saver = tf.train.Saver{"v2": v2})
# Use the saver object normally after that.
with tf.Session() as sess:
# Initialize v1 since the saver will not.
v1.initializer.run()
saver.restore(sess, "/tmp/model.ckpt")
print("v1 : %s" % v1.eval())
print("v2 : %s" % v2.eval())
注意:
- 如果需要保存和恢复模型变量的不同子集,可以根据需要创建任意数量的
Save
对象。同一个变量可以列在多个保存器对象中; 它的值只有在Saver.restore()
方法运行时才会改变。
- 如果您只在会话开始时恢复模型变量的子集,则必须为其他变量运行初始化操作。查看
tf.variables_initializer
了解更多信息。
- 要检索检查点中的变量,可以使用
inspect_checkpoint
库,特别是print_tensors_in_checkpoint_file
函数。
- 默认情况下,
Saver
使用tf.Variable.name
每个变量的属性值。但是,在创建Saver
对象时,可以选择为检查点文件中的变量选择名称。
保存和恢复模型概述
当你想保存和加载变量,图表和图表的元数据 - 基本上,当你想保存或恢复你的模型时 - 我们推荐使用SavedModel
。SavedModel
是一种与语言无关,可恢复的密封式序列化格式。SavedModel
使更高级别的系统和工具能够生成,消耗和变换TensorFlow模型。TensorFlow提供了多种与SavedModel
交互的机制,包括tf.saved_model API,Estimator API和CLI。
用于构建和加载SavedModel的API
本节重点介绍用于构建和加载SavedModel的API,特别是在使用较低级别的TensorFlow API的情况。
构建SavedModel
我们提供了SavedModel 构建器的Python实现。SavedModelBuilder
类提供的功能保存多个MetaGraphDef
。MetaGraph
是数据流图,加上它的相关变量,资产和签名
。MetaGraphDef
是MetaGraph
的协议缓冲表示。签名
是一组从图中的输入和输出。
如果需要将资产保存并写入或复制到磁盘,则可以在MetaGraphDef
添加第一个资源时提供资源。如果多个MetaGraphDef
s与同名资产相关联,则只保留第一个版本。
每个MetaGraphDef
添加到SavedModel的用户都必须使用用户指定的标签进行注释。这些标签提供了一种手段来识别特定MetaGraphDef
来加载和恢复以及共享的一组变量和资产。这些标签通常MetaGraphDef
使用其功能(例如,服务或培训)和可选的硬件的特定方面(例如GPU)对其进行注释。
例如,以下代码展示了一种使用SavedModelBuilder
构建SavedModel 的典型方法:
export_dir = ...
...
builder = tf.saved_model_builder.SavedModelBuilder(export_dir)
with tf.Session(graph=tf.Graph()) as sess:
...
builder.add_meta_graph_and_variables(sess,
[tag_constants.TRAINING],
signature_def_map=foo_signatures,
assets_collection=foo_assets)
...
# Add a second MetaGraphDef for inference.
with tf.Session(graph=tf.Graph()) as sess:
...
builder.add_meta_graph([tag_constants.SERVING])
...
builder.save()
在Python中加载SavedModel
SavedModel 加载器的Python版本为SavedModel 提供加载和恢复功能。该load
操作需要以下信息:
- 在会话中恢复图形定义和变量。
- 这些标签用于标识要加载的MetaGraphDef。
- SavedModel的位置(目录)。
加载时,作为特定 MetaGraphDef的一部分提供的变量,资产和签名的子集将被恢复到提供的会话中。
export_dir = ...
...
with tf.Session(graph=tf.Graph()) as sess:
tf.saved_model.loader.load(sess, [tag_constants.TRAINING], export_dir)
...
Loading a Savedmodel in C++
C ++版本中SavedModel 的加载器提供了一个API来从路径加载SavedModel,同时允许SessionOptions
和RunOptions
。您必须指定与要加载的图形关联的标签。SavedModel的加载版本被称为,SavedModelBundle
并包含MetaGraphDef和它加载的会话。
const string export_dir = ...
SavedModelBundle bundle;
...
LoadSavedModel(session_options, run_options, export_dir, {kSavedModelTagTrain},
&bundle
标准常量
SavedModel为各种用例构建和加载TensorFlow图表提供了灵活性。对于最常见的用例,SavedModel的API在Python和C ++中提供了一组易于重复使用和持续共享工具的常量。
标准MetaGraphDef标签
您可以使用多组标签来唯一标识MetaGraphDef
SavedModel中保存的内容。常用标签的一个子集在以下中指定:
标准SignatureDef常量
SignatureDef
是一个协议缓冲,其限定由图形支持的计算的签名。常用的输入键,输出键和方法名称定义如下:
Using SavedModel with Estimators
在训练Estimator
模型之后,您可能希望从该模型创建一个服务来接收请求并返回结果。您可以在您的计算机本地运行此类服务,或者在云中对其进行可扩展部署。
要准备一个用于服务的训练完好的估算器,您必须以标准SavedModel格式导出它。本节介绍如何导出:
- 指定可以提供的输出节点和相应的API(分类,回归或预测)。
- 将您的模型导出为SavedModel格式。
- 从本地服务器提供模型并请求预测。
准备服务于输入
在训练期间,从input_fn()
摄取数据并准备好供模型使用。在服务时间,类似,serving_input_receiver_fn()
接受推理请求并为模型做好准备。该功能具有以下目的:
- 向关系图中添加占位符,服务系统将使用推理请求进行馈送
- 要添加将数据从输入格式转换为模型所需的特征张量所需的任何额外操作。
函数返回一个tf.estimator.export.ServingInputReceiver
对象,该对象将占位符和生成的特征Tensor
组合在一起。
典型的模式是推理请求以序列化tf.Example
的形式到达,因此serving_input_receiver_fn()
创建一个单独的字符串占位符来接收它们。的serving_input_receiver_fn()
是随后也负责解析tf.Example
通过向曲线图添加 tf.parse_example
操作。
在编写serving_input_receiver_fn()
这样的代码时,您必须将解析规范传递给tf.parse_example
告诉解析器哪些功能名称可以期待以及如何将它们映射到Tensor
s。解析规范需要一个字典的从功能名称的形式tf.FixedLenFeature
,tf.VarLenFeature
和tf.SparseFeature
。请注意,此解析规范不应包含任何标签或权重列,因为这些列在服务时间将不可用 -- 与input_fn()
训练时使用的解析规范相反。
然后结合:
feature_spec = {'foo': tf.FixedLenFeature(...),
'bar': tf.VarLenFeature(...)}
def serving_input_receiver_fn():
"""An input receiver that expects a serialized tf.Example."""
serialized_tf_example = tf.placeholder(dtype=tf.string,
shape=[default_batch_size],
name='input_example_tensor')
receiver_tensors = {'examples': serialized_tf_example}
features = tf.parse_example(serialized_tf_example, feature_spec)
return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)
tf.estimator.export.build_parsing_serving_input_receiver_fn
效用函数提供了普遍情况下的输入接收器。
注意:
在使用Predict API和本地服务器训练要提供的模型时,不需要解析步骤,因为该模型将接收原始特征数据。
即使您不需要解析或其他输入处理,也就是说,如果服务系统Tensor
直接提供功能,您仍然必须提供一个serving_input_receiver_fn()
为特征Tensor
创建占位符并将其传递的功能。tf.estimator.export.build_raw_serving_input_receiver_fn
的使用实现了这一功能。
如果这些实用程序不能满足您的需求,您可以自由编写serving_input_receiver_fn()
。可能需要的一种情况是,如果您训练的input_fn()
包含某些必须在服务时间重演的预处理逻辑。为了减轻在训练服务倾斜的风险,我们建议将处理封装在一个函数,次函数将会从input_fn()
和serving_input_receiver_fn()
两者中被调用。
请注意,这serving_input_receiver_fn()
也决定了签名的输入
部分。也就是说,在编写时serving_input_receiver_fn()
,必须告诉解析器哪些特征符合预期,以及如何将它们映射到模型的预期输入
。相反,签名的输出
部分由模型确定。
执行导出
要导出已训练的估算器,用出口基线路径调用tf.estimator.Estimator.export_savedmodel
和serving_input_receiver_fn
。
estimator.export_savedmodel(export_dir_base, serving_input_receiver_fn)
这个方法通过首先调用serving_input_receiver_fn()建立一个新的图,以获得特征Tensor,然后调用此Estimator的model_fn(),以基于这些特征的模型曲线图。它会重新启动Session,并且默认情况下会将最近的检查点恢复到它。(如果需要,可以传递不同的检查点。)最后,它在给定的export_dir_base(即,export_dir_base/<timestamp>)下面创建一个带时间戳的导出目录,并将SavedModel写入其中,其中包含MetaGraphDef从此Session中保存的单个文件。
注意:
您有责任收集旧输出的无效信息。否则,连续输出将累积在export_dir_base
下。
指定自定义模型的输出
编写自定义model_fn
时,必须填充返回值的export_outputs
元素tf.estimator.EstimatorSpec
。这是{name: output}
描述在服务期间输出和使用的带有输出签名的词典。
在进行单一预测的通常情况下,这个词典包含一个元素,而且name
不重要。在一个多头模型中,每个头部都由这个词典中的一个条目表示。在这种情况下,name
是一个可您以选择的字符串用于请求服务时间的特定头像。
每个output
值必须是一个ExportOutput
对象
这些输出类型直接映射到TensorFlow服务API,因此遵守将确定哪些请求类型。
注意:
在多头情况下,SignatureDef
将为export_outputs
从model_fn返回的dict的每个元素生成一个使用相同key命名的元素。这些SignatureDef
仅在它们的输出方面有所不同,正如相应ExportOutput
条目所提供的。输入总是由输入提供的serving_input_receiver_fn
。推断请求可以按名称指定头部。一个头部必须使用signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
指示,SignatureDef
在推理请求没有指定哪一个时将被提供。
在本地提供导出的模型
对于本地部署,您可以使用TensorFlow服务为您的模型提供服务,这是一个开源项目,用于加载SavedModel并将其作为gRPC服务公开。
然后构建并运行本地模型服务器,用上面导出的SavedModel的路径替换$export_dir_base
:
bazel build //tensorflow_serving/model_servers:tensorflow_model_server
bazel-bin/tensorflow_serving/model_servers/tensorflow_model_server --port=9000 --model_base_path=$export_dir_base
现在您有一台服务器在端口9000上通过gRPC监听推理请求!
从本地服务器请求预测
根据PredictionService gRPC API服务定义,服务器响应gRPC请求。(嵌套协议缓冲区在各种相邻文件中定义)。
从API服务定义中,gRPC框架以各种语言生成客户端库,提供对API的远程访问。在使用Bazel构建工具的项目中,这些库是自动构建的,并通过这些依赖项提供(例如使用Python):
deps = [
"//tensorflow_serving/apis:classification_proto_py_pb2",
"//tensorflow_serving/apis:regression_proto_py_pb2",
"//tensorflow_serving/apis:predict_proto_py_pb2",
"//tensorflow_serving/apis:prediction_service_proto_py_pb2"
]
Python客户端代码可以导入这些库:
from tensorflow_serving.apis import classification_pb2
from tensorflow_serving.apis import regression_pb2
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2
注意:
prediction_service_pb2
将服务定义为一个整体,因此始终是必需的。然而一个典型的客户端将只需要classification_pb2
,regression_pb2
以及predict_pb2
中的一个,取决于所取得的类型的请求。
发送gRPC请求然后通过组装包含请求数据的协议缓冲区并将其传递给服务存根来完成。请注意请求协议缓冲区如何创建为空区,然后通过生成的协议缓冲区API填充。
from grpc.beta import implementations
channel = implementations.insecure_channel(host, int(port))
stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)
request = classification_pb2.ClassificationRequest()
example = request.input.example_list.examples.add()
example.features.feature['x'].float_list.value.extend(image[0].astype(float))
result = stub.Classify(request, 10.0) # 10 secs timeout
本例中返回的结果是一个ClassificationResponse
协议缓冲区。
这是一个框架示例; 请参阅Tensorflow服务文档和示例以获取更多详细信息。
注意:
ClassificationRequest
和RegressionRequest
包含一个tensorflow.serving.Input
协议缓冲区,该缓冲区又包含一个tensorflow.Example
协议缓冲区列表。PredictRequest
相反,它包含从要素名称到通过编码值的映射TensorProto
。相应地:当使用Classify
和Regress
API时,TensorFlow Serving将序列化tf.Example
到图中,所以你serving_input_receiver_fn()
应该包含一个tf.parse_example()
操作。但是,当使用通用Predict
API时,TensorFlow Serving会将原始特征数据提供给图形,因此serving_input_receiver_fn()
应该使用通过。
CLI检查并执行SavedModel
您可以使用SavedModel命令行界面(CLI)检查并执行SavedModel。例如,您可以使用CLI检查模型的SignatureDef
。CLI使您能够快速确认输入张量的dtype和形状与模型匹配。此外,如果您想测试模型,可以使用CLI通过以各种格式传递示例输入(例如,Python表达式)并获取输出来进行健全性检查。
安装SavedModel CLI
一般来说,您可以通过以下两种方式之一安装TensorFlow:
- 通过安装预构建的TensorFlow二进制文件。
- 通过从源代码构建TensorFlow。
如果您通过预构建的TensorFlow二进制文件安装了TensorFlow,则SavedModel CLI已经以路径名安装在您的系统上bin\saved_model_cli
。
如果您从源代码构建TensorFlow,则必须运行以下附加命令来构建saved_model_cli
:
$ bazel build tensorflow/python/tools:saved_model_cli
命令概述
SavedModel CLI在SavedModel中MetaGraphDef
上支持以下两个命令:
show
,它显示MetaGraphDef
在SavedModel 中的一个计算。
run
,它在MetaGraphDef
上运行计算。
show 命令
SavedModel包含一个或多个MetaGraphDef
,由其标签集标识。为了服务一个模型,你可能会想知道SignatureDef
每个模型中是什么类型的,他们的输入和输出是什么。该show
命令可让您按层次结构检查SavedModel的内容。语法如下:
usage: saved_model_cli show [-h] --dir DIR [--all]
[--tag_set TAG_SET] [--signature_def SIGNATURE_DEF_KEY]
例如,以下命令显示SavedModel中所有可用的MetaGraphDef标记集:
$ saved_model_cli show --dir /tmp/saved_model_dir
The given SavedModel contains the following tag-sets:
serve
serve, gpu
以下命令显示MetaGraphDef
中的所有可用SignatureDef
键:
$ saved_model_cli show --dir /tmp/saved_model_dir --tag_set serve
The given SavedModel `MetaGraphDef` contains `SignatureDefs` with the
following keys:
SignatureDef key: "classify_x2_to_y3"
SignatureDef key: "classify_x_to_y"
SignatureDef key: "regress_x2_to_y3"
SignatureDef key: "regress_x_to_y"
SignatureDef key: "regress_x_to_y2"
SignatureDef key: "serving_default"
如果标签集中MetaGraphDef
有多个
标签,则必须指定所有标签,每个标签用逗号分隔。例如:
$ saved_model_cli show --dir /tmp/saved_model_dir --tag_set serve,gpu
要显示对应于SignatureDef
特定的所有输入和输出TensorInfo ,请将SignatureDef
密钥传递给signature_def
选项。当你想知道张量键值,输入张量的类型和形状以便稍后执行计算图,这非常有用。例如:
$ saved_model_cli show --dir \
/tmp/saved_model_dir --tag_set serve --signature_def serving_default
The given SavedModel SignatureDef contains the following input(s):
inputs['x'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: x:0
The given SavedModel SignatureDef contains the following output(s):
outputs['y'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: y:0
Method name is: tensorflow/serving/predict
要显示SavedModel中的所有可用信息,请使用该--all
操作。例如:
$ saved_model_cli show --dir /tmp/saved_model_dir --all
MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:
signature_def['classify_x2_to_y3']:
The given SavedModel SignatureDef contains the following input(s):
inputs['inputs'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: x2:0
The given SavedModel SignatureDef contains the following output(s):
outputs['scores'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: y3:0
Method name is: tensorflow/serving/classify
...
signature_def['serving_default']:
The given SavedModel SignatureDef contains the following input(s):
inputs['x'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: x:0
The given SavedModel SignatureDef contains the following output(s):
outputs['y'] tensor_info:
dtype: DT_FLOAT
shape: (-1, 1)
name: y:0
Method name is: tensorflow/serving/predict
run 命令
调用该run
命令以运行图计算,传递输入,然后显示(并可选地保存)输出。语法如下:
usage: saved_model_cli run [-h] --dir DIR --tag_set TAG_SET --signature_def
SIGNATURE_DEF_KEY [--inputs INPUTS]
[--input_exprs INPUT_EXPRS] [--outdir OUTDIR]
[--overwrite] [--tf_debug]
run
命令提供了以下两种方式将输入传递给模型:
--inputs
操作使您能够在文件中传递numpy ndarray。
--input_exprs
操作可以让你传递Python表达式。
--inputs
要在文件中传递输入数据,请指定--inputs
操作,其格式如下:
--inputs <INPUTS>
其中INPUTS
是以下任一格式:
- <input_key>=<filename>
- <input_key>=<filename>[<variable_name>]
您可能会传递多个INPUTS
。如果您确实要传递多个输入
,请使用分号分隔每个输入
。
saved_model_cli
使用numpy.load
加载的文件名
。文件名
可以是如下任何格式:
.npy
.npz
- pickle format
一个.npy
文件总是包含一个numpy ndarray。因此,从.npy
文件加载时,内容将直接分配给指定的输入张量。如果用该文件指定variable_name
.npy
,variable_name
将被忽略并发出警告。
从.npz
(zip)文件加载时,您可以选择指定一个variable_name
来标识zip文件中用于加载输入张量密钥的变量。如果您未指定variable_name
,则SavedModel CLI将检查zip文件中是否只包含一个文件,并将其加载到指定的输入张量密钥。
从pickle文件加载时,如果在方括号中没有指定variable_name
,内容将被传递到指定的输入那么pickle文件中的张量键。否则,SavedModel CLI会假定一个字典存储在pickle文件中,并且将使用与variable_name
对应的值。
--inputs_exprs
要通过Python表达式传递输入,请指定该--input_exprs
操作。这对于没有数据文件的情况很有用,但仍然希望用一些与模型的dtype和shape匹配的简单输入来检查模型SignatureDef
。例如:
`input_key=[[1], [2], [3]]`
除了Python表达式之外,您还可以传递numpy函数。例如:
input_key=np.ones((32, 32, 3))
(请注意,该numpy
模块已可供您使用np
。)
保存输出
默认情况下,SavedModel CLI将输出写入标准输出。如果一个目录传递给--outdir
选项,输出将被保存为在给定目录下以输出张量键命名的npy文件。
使用--overwrite
覆盖现有的输出文件。
TensorFlow调试器(tfdbg)集成
如果--tf_debug
操作被设置,SavedModel CLI将使用TensorFlow调试器(tfdbg)在运行SavedModel时观察中间张量和运行时图或子图。
run完整的例子
鉴于:
- 您的模型只需添加
x1
并x2
获取输出y
。
- 模型中的所有张量都具有形状为
(-1, 1)
。
- 你有两个
npy
文件:
/tmp/my_data1.npy
,其中包含一个numpy的ndarray[[1], [2], [3]]
。
/tmp/my_data2.npy
,其中包含另一个numpy ndarray[[0.5], [0.5], [0.5]]
。
通过模型运行这两个文件以npy
获取输出y
,请发出以下命令:
$ saved_model_cli run --dir /tmp/saved_model_dir --tag_set serve \
--signature_def x1_x2_to_y --inputs x1=/tmp/my_data1.npy;x2=/tmp/my_data2.npy \
--outdir /tmp/out
Result for output key y:
[[ 1.5]
[ 2.5]
[ 3.5]]
让我们稍微改变一下前面的例子。这一次,不是两个.npy
文件,你现在有一个.npz
文件和一个pickle文件。此外,你想覆盖任何现有的输出文件。这里是命令:
$ saved_model_cli run --dir /tmp/saved_model_dir --tag_set serve \
--signature_def x1_x2_to_y \
--inputs x1=/tmp/my_data1.npz[x];x2=/tmp/my_data2.pkl --outdir /tmp/out \
--overwrite
Result for output key y:
[[ 1.5]
[ 2.5]
[ 3.5]]
您可以指定python表达式而不是输入文件。例如,以下命令用x2
Python表达式替换输入:
$ saved_model_cli run --dir /tmp/saved_model_dir --tag_set serve \
--signature_def x1_x2_to_y --inputs x1=/tmp/my_data1.npz[x] \
--input_exprs 'x2=np.ones((3,1))'
Result for output key y:
[[ 2]
[ 3]
[ 4]]
要使用TensorFlow调试器运行模型,请发出以下命令:
$ saved_model_cli run --dir /tmp/saved_model_dir --tag_set serve \
--signature_def serving_default --inputs x=/tmp/data.npz[x] --tf_debug
SavedModel目录的结构
当您以SavedModel格式保存模型时,TensorFlow会创建一个由以下子目录和文件组成的SavedModel目录:
assets/
assets.extra/
variables/
variables.data-?????-of-?????
variables.index
saved_model.pb|saved_model.pbtxt
其中:
assets
是包含辅助(外部)文件(如词汇表)的子文件夹。资产被复制到SavedModel位置,并且可以在加载特定位置时读取MetaGraphDef
。
assets.extra
是一个子文件夹,其中较高级别的库和用户可以添加自己的资源,该资源与模型共存,但不会被图加载。该子文件夹不由SavedModel库管理。
variables
是包含输出的子文件夹tf.train.Saver
。
saved_model.pb
或者saved_model.pbtxt
是SavedModel协议缓冲区。它包含图形定义作为MetaGraphDef
协议缓冲区。
一个SavedModel可以表示多个图。在这种情况下,在SavedModel所有图形共享一个单一的
一套检查点(变量)和资产。例如,下图显示了一个包含三个MetaGraphDef
的SavedModel,其中三个共享同一组检查点和资产:
每个图形都与一组特定的标签相关联,这些标签可以在加载或恢复操作期间进行识别。