TensorFlow:如何以及为什么使用SavedMod

2024-05-23 14:59:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有几个关于SavedModelAPI的问题,我发现它的documentation留下了很多无法解释的细节。

前三个问题是如何传递给tf.saved_model.builder.SavedModelBuilder方法的参数,而第四个问题是为什么要在tf.train.Saver上使用SavedModelAPI。

  1. 参数signature_def_map的格式是什么?保存模型时通常需要设置此参数吗?

  2. 类似地,assets_collection参数的格式是什么?

  3. 为什么要用一个元图保存一个标记列表,而不是仅仅给它一个名称(即只给它附加一个惟一的标记)?为什么要在给定的元图中添加多个标记?如果我试图通过某个标记从pb加载一个metagrpah,但是该pb中的多个metagraph与该标记匹配呢?

  4. 该文档认为,建议使用SavedModel将整个模型(而不是只保存变量)保存在自包含的文件中。但是tf.train.Saver除了在.meta文件中保存变量之外,还保存图形。那么使用SavedModel有什么好处呢?文件上说

When you want to save and load variables, the graph, and the graph's metadata--basically, when you want to save or restore your model--we recommend using SavedModel. SavedModel is a language-neutral, recoverable, hermetic serialization format. SavedModel enables higher-level systems and tools to produce, consume, and transform TensorFlow models.

但这个解释很抽象,并不能真正帮助我理解SavedModel的优点是什么。在SavedModel(相对于tf.train.Saver)更适合使用的具体例子是什么?

请注意,我的问题不是this question的副本。我不是问如何保存模型,而是问关于SavedModel属性的非常具体的问题,这只是TensorFlow提供的保存和加载模型的多种机制之一。链接问题中的任何答案都不会触及SavedModelAPI(它再次与tf.train.Saver不同)。


Tags: and文件to标记模型you参数model
1条回答
网友
1楼 · 发布于 2024-05-23 14:59:01

编辑:我在TensorFlow 1.4上写的。到今天为止(TensorFlow1.12是稳定的,有1.13rc,2.0就在附近),这个问题中链接的文档有了很大的改进。


我试图使用tf.saved_model,同时也发现文档相当(太)抽象。以下是我对你问题的完整回答:

一。signature_def_map

a.格式参见汤姆对Tensorflow: how to save/restore a model的回答。(Ctrl-F表示“tf.saved_model”-目前,这个短语在这个问题上的唯一用法是在他的答案中)。

b.需要据我所知,您通常确实需要它。如果要使用模型,则需要知道图形的输入和输出。我认为它类似于C++函数签名:如果你想在调用一个函数或在另一个C++文件中定义函数,你需要在主文件中签名(即原型或头文件)。

2。assets_collection

格式:找不到清晰的文档,所以我去了生成器source code。该参数似乎是dtype=tf.string的张量的iterable,其中每个张量都是资产目录的路径。所以,张量流Graph collection应该可以工作。我想这是参数的名称,但是从源代码来看,我希望Pythonlist也能工作。

(你没有问你是否需要设置它,但是从佐伊对What are assets in tensorflow?的回答和iga对相切相关Tensorflow serving: “No assets to save/writes” when exporting models的回答来看,它通常不需要设置。)

三。标签:

a.Why list我不知道为什么您必须传递一个列表,但您可以传递一个包含一个元素的列表。例如,在我当前的项目中,我只使用[tf...tag_constants.SERVING]标记。

b.何时使用多个表示您正在使用显式设备放置进行操作。也许您想保存图形的CPU版本和GPU版本。很明显,您想保存每个服务版本,并说您想保存培训检查点。您可以使用CPU/GPU标签和培训/服务标签来管理所有案例。这里的docs提示是:

Each MetaGraphDef added to the SavedModel must be annotated with user-specified tags. The tags provide a means to identify the specific MetaGraphDef to load and restore, along with the shared set of variables and assets. These tags typically annotate a MetaGraphDef with its functionality (for example, serving or training), and optionally with hardware-specific aspects (for example, GPU).

c.碰撞 我懒得自己去强制冲突-我看到两个需要解决的情况-我去了加载程序source code。在def load内部,您将看到:

saved_model = _parse_saved_model(export_dir)
found_match = False
for meta_graph_def in saved_model.meta_graphs:
  if set(meta_graph_def.meta_info_def.tags) == set(tags):
    meta_graph_def_to_load = meta_graph_def
    found_match = True
    break

if not found_match:
  raise RuntimeError(
      "MetaGraphDef associated with tags " + str(tags).strip("[]") +
      " could not be found in SavedModel. To inspect available tag-sets in"
      " the SavedModel, please use the SavedModel CLI: `saved_model_cli`"
  )

在我看来,它正在寻找一个完全匹配的。E、 假设你有一个标记为“GPU”和“Serving”的元图和一个标记为“Serving”的元图。如果你加载“Serving”,你会得到后一个元图。另一方面,假设您有一个元图“GPU”和“Serving”,以及一个元图“CPU”和“Serving”。如果你试图加载“服务”,你会得到错误。如果您尝试在同一文件夹中保存两个具有完全相同标记的元图,我希望您将覆盖第一个元图。看起来构建代码并没有以任何特殊的方式处理这种冲突。

四。SavedModeltf.train.Saver

这也让我困惑。威克对Should TensorFlow users prefer SavedModel over Checkpoint or GraphDef?的回答为我澄清了事实。我把我的两分钱投进去:

在本地Python+TensorFlow的范围内,您可以让tf.train.Saver做任何事情。但是,这会让你付出代价。让我概述一下save-a-trained-model-and-deploy用例。你需要你的saver对象。设置它以保存完整的图形(每个变量)是最简单的。您可能不想一直保存.meta,因为您使用的是静态图。你需要在你的训练钩中指定。你可以读到这些on cv-tricks。训练结束后,需要将检查点文件转换为pb文件。这通常意味着清除当前图形,恢复检查点,用tf.python.framework.graph_util将变量冻结为常量,并用tf.gfile.GFile编写它。你可以读到这些。之后,您需要在Python中部署它。您需要输入和输出张量名称-图形定义中的字符串名称。你可以阅读on metaflow(实际上是tf.train.Saver方法的一篇很好的博客文章)。一些操作节点将让您可以轻松地将数据输入它们。有些不那么多。我通常放弃寻找合适的节点,并添加了一个tf.reshape,它实际上并没有改变任何图形定义的形状。那是我的特别输入节点。输出相同。最后,您可以部署您的模型,至少可以在Python中本地部署。

或者,您可以使用我在第1点中链接的答案来使用SavedModelAPI完成所有这一切。多亏了汤姆的回答,头痛少了。如果有适当的文档记录,您将在将来获得更多的支持和功能。看起来更容易使用命令行服务(medium link包含了使用Saver来实现这一点——看起来很难,祝你好运!)。它实际上已经被新的估计器所接受了。据医生说

SavedModel is a language-neutral, recoverable, hermetic serialization format.

强调:你可以把你的训练模型更容易地应用到不断增长的C++ API中。

在我看来,它就像数据集API。这比以前的方式简单多了!

至于tf.train.SaverSavedModel的具体例子:如果“基本上,当你想保存或恢复你的模型”对你来说还不够清楚:正确的使用时间是任何时候,它都会让你的生活更容易。对我来说,这似乎总是。特别是如果你使用估计量,在C++中部署,或者使用命令行服务。

所以这就是我对你问题的研究。或四个列举的问题。呃,八个问号。希望这有帮助。

相关问题 更多 >