本文档介绍如何保存和恢复 变量和模型。
保存和恢复变量
TensorFlow变量提供了表示程序处理的共享,持久状态的最佳方法。(有关详细信息,请参阅变量。)本节介绍如何保存和恢复变量。请注意,估算器会自动保存和恢复变量(在该项中model_dir
)。
本tf.train.Saver
类提供了保存和恢复模型的方法。该tf.train.Saver
构造函数添加save
和restore
OPS的图形全部或指定列表图中的变量。该Saver
对象提供了运行这些操作的方法,指定检查点文件写入或读取的路径。
保存程序将恢复模型中已定义的所有变量。如果您在不知道如何构建其图形的情况下加载模型(例如,如果要编写通用程序来加载模型),请阅读 本文档后面的“保存和恢复模型概述”一节。
TensorFlow将变量保存在二进制检查点文件中,大致来说,将变量名映射到张量值。
保存变量
创建Saver
与tf.train.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())
笔记:
-
Saver
如果需要保存并恢复模型变量的不同子集,则可以创建任意数量的对象。同一变量可以列在多个保护对象中; 其值仅在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
秒。一元图是数据流图,加上它的相关变量,资产和签名。A 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) ...
在C ++中加载Savedmodel
SavedModel 加载器的C ++版本 提供了一个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 是一个协议缓冲,其限定由图形支持的计算的签名。常用的输入键,输出键和方法名称定义如下:
使用SavedModel与估算器
训练Estimator
模型后,您可能需要从该模型创建一个服务,该服务需要请求并返回结果。您可以在本地运行这样的服务,或在云中部署它。
要准备训练有素的估算器进行投放,必须以标准的SavedModel格式导出。本节介绍如何:
- 指定可以提供的输出节点和相应的 API (分类,回归或预测)。
- 将模型导出为SavedModel格式。
- 从本地服务器提供模型并请求预测。
准备服务投入
在训练期间,input_fn()
摄取数据并准备供模型使用。在服务的时候,类似地,serving_input_receiver_fn()
接受推理请求并准备他们的模型。此功能有以下目的:
- 要向图表添加占位符,即服务系统将为推荐请求提供馈送。
- 添加任何额外的操作,将数据从输入格式转换
Tensor
为模型预期的功能。
该函数返回一个tf.estimator.export.ServingInputReceiver
对象,它将占位符和结果特征Tensor
组合在一起。
典型的模式是推理请求以序列化tf.Example
s 的形式到达 ,因此serving_input_receiver_fn()
创建一个单个字符串占位符来接收它们。的serving_input_receiver_fn()
是随后也负责解析tf.Example
通过添加A S tf.parse_example
op将曲线图。
在写这样的时候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
s,然后调用此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}
描述在投放期间要导出和使用的输出签名的命令。
在通常的单个预测的情况下,这个dict包含一个元素,而且name
是无关紧要的。在一个多头模型中,每个头都用这个指令中的条目表示。在这种情况下name
,您可以选择一个可用于在服务时间请求特定头部的字符串。
每个output
值必须是一个ExportOutput
对象,例如tf.estimator.export.ClassificationOutput
,tf.estimator.export.RegressionOutput
,或 tf.estimator.export.PredictOutput
。
这些输出类型直接映射到 TensorFlow服务API,因此确定哪些请求类型将被遵守。
注意:在多头的情况下,SignatureDef
将为export_outputs
使用相同的键命名的model_fn返回的dict的每个元素生成一个。这些SignatureDef
不同之处在于它们的输出,如相应ExportOutput
条目所提供的。输入始终是由...提供的serving_input_receiver_fn
。推理请求可以按名称指定头。必须使用一个头来命名signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
,SignatureDef
当推断请求没有指定时,将会提供哪个头。
在本地提供导出的模型
对于本地部署,您可以使用TensorFlow服务(一种加载SavedModel并将其公开为gRPC服务的开源项目)来投放您的模型 。
首先,安装TensorFlow服务。
然后构建并运行本地模型服务器,$export_dir_base
用上面导出的SavedModel的路径替换
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服务 文档和示例。
注意:并包含一个 协议缓冲区,它又包含协议缓冲区列表 。 相比之下,包含从功能名称到通过编码的值的映射。相应地:当使用和API,TensorFlow服务提要序列化s到图表,所以你 应该包括一个Op。然而,当使用通用API时,TensorFlow Serving将原始特征数据提供给图形,因此 应该使用通过。 ClassificationRequestRegressionRequesttensorflow.serving.Inputtensorflow.ExamplePredictRequestTensorProtoClassifyRegresstf.Exampleserving_input_receiver_fn()tf.parse_example()Predictserving_input_receiver_fn()
CLI检查并执行SavedModel
您可以使用SavedModel命令行界面(CLI)来检查并执行SavedModel。例如,您可以使用CLI来检查模型SignatureDef
。CLI使您能够快速确认输入的 Tensor dtype和形状与型号相匹配。此外,如果要测试您的模型,您可以使用CLI通过传递各种格式的示例输入(例如Python表达式),然后获取输出来进行健全检查。
安装SavedModel CLI
一般来说,您可以通过以下两种方式安装TensorFlow:
- 通过安装预先构建的TensorFlow二进制文件。
- 从源代码构建TensorFlow。
如果您通过预先构建的TensorFlow二进制文件安装了TensorFlow,那么SavedModel CLI已经以pathname的身份安装在系统上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
s,由标签集标识。为了服务一个模型,你可能会想知道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
以下命令显示a中的所有可用SignatureDef
键MetaGraphDef
:
$ 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
要显示所有输入和输出的TensorInfo为特定的SignatureDef
,将SignatureDef
密钥传递给signature_def
选项。当您想知道用于稍后执行计算图的输入张量的张量键值,dtype和形状时,这非常有用。例如:
$ 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。如果您确实传递了多个输入,请使用分号分隔每个INPUTS。
saved_model_cli
用于numpy.load
加载文件名。的文件名可以是任何的格式如下:
.npy
.npz
- 泡菜格式
一个.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和形状相匹配的简单输入来检查模型SignatureDef
。例如:
`input_key=[[1], [2], [3]]`
除了Python表达式,您还可以传递numpy函数。例如:
input_key=np.ones((32, 32, 3))
(请注意,numpy
模块已经可以作为np
。)
保存输出
默认情况下,SavedModel CLI将输出写入stdout。如果将目录传递给--outdir
选项,则输出将被保存为以给定目录下的输出张量键命名的npy文件。
使用--overwrite
覆盖现有的输出文件。
TensorFlow调试器(tfdbg)集成
如果--tf_debug
选项设置,SavedModel CLI将使用TensorFlow Debugger(tfdbg)在运行SavedModel时观察中间的Tensors和运行时图形或子图。
完整的例子 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 Debugger运行模型,请发出以下命令:
$ 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
S的SavedModel,其中三个共享同一组检查点和资产: