首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Saving and Restoring(模型存储和加载)

本文档介绍了如何保存和恢复变量和模型。

保存和恢复变量

TensorFlow变量提供了表示由程序操作的共享持久状态的最佳方式。(有关详细信息,请参阅变量。)本节介绍如何保存和恢复变量。请注意,估算器会自动保存和恢复变量(在model_dir)中。

tf.train.Saver类提供了保存和恢复模型的方法。tf.train.Saver构造函数为全部图形添加saverestore操作、或指定列表图中的变量。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类提供的功能保存多个MetaGraphDefMetaGraph是数据流图,加上它的相关变量,资产和签名。MetaGraphDef是MetaGraph的协议缓冲表示。签名是一组从图中的输入和输出。

如果需要将资产保存并写入或复制到磁盘,则可以在MetaGraphDef添加第一个资源时提供资源。如果多个MetaGraphDefs与同名资产相关联,则只保留第一个版本。

每个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,同时允许SessionOptionsRunOptions。您必须指定与要加载的图形关联的标签。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标签

您可以使用多组标签来唯一标识MetaGraphDefSavedModel中保存的内容。常用标签的一个子集在以下中指定:

标准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告诉解析器哪些功能名称可以期待以及如何将它们映射到Tensors。解析规范需要一个字典的从功能名称的形式tf.FixedLenFeaturetf.VarLenFeaturetf.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_savedmodelserving_input_receiver_fn

estimator.export_savedmodel(export_dir_base, serving_input_receiver_fn)

这个方法通过首先调用serving_input_receiver_fn()建立一个新的图,以获得特征Tensor,然后调用此Estimatormodel_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是一个可您以选择的字符串用于请求服务时间的特定头像。

这些输出类型直接映射到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_pb2regression_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服务文档和示例以获取更多详细信息。

注意: ClassificationRequestRegressionRequest包含一个tensorflow.serving.Input协议缓冲区,该缓冲区又包含一个tensorflow.Example协议缓冲区列表。PredictRequest相反,它包含从要素名称到通过编码值的映射TensorProto。相应地:当使用ClassifyRegressAPI时,TensorFlow Serving将序列化tf.Example到图中,所以你serving_input_receiver_fn()应该包含一个tf.parse_example()操作。但是,当使用通用PredictAPI时,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.npyvariable_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完整的例子

鉴于:

  • 您的模型只需添加x1x2获取输出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表达式而不是输入文件。例如,以下命令用x2Python表达式替换输入:

$ 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,其中三个共享同一组检查点和资产:

每个图形都与一组特定的标签相关联,这些标签可以在加载或恢复操作期间进行识别。

扫码关注腾讯云开发者

领取腾讯云代金券