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

发布于 2021-01-29 15:11:41

我对SavedModelAPI有一些疑问,我发现其文档留下了许多无法解释的细节。

前三个问题是关于将什么传递给add_meta_graph_and_variables()方法的参数tf.saved_model.builder.SavedModelBuilder,而第四个问题是关于为什么要在SavedModelAPI上使用API
tf.train.Saver

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

  2. 同样,assets_collection参数的格式是什么?

  3. 为什么只用一个元符号保存一个标签列表,而不是仅仅给它一个名字(即,只附加一个唯一的标签)?为什么要在给定的元图中添加多个标签?如果我尝试pb通过某个标签从a加载metagrpah ,但是pb该标签中的多个图元与该标签匹配,该怎么办?

  4. 该文档指出,建议使用SavedModel整个模型(仅与变量相对)保存在独立文件中。但tf.train.Saver也节省了除了在一个变量中的图形.meta文件。那么,使用的好处是SavedModel什么?该文件说

当您要保存和加载变量,图形以及图形的元数据时(基本上,当您要保存或恢复模型时),建议使用SavedModel。SavedModel是一种与语言无关的,可恢复的,密封的序列化格式。SavedModel支持更高级的系统和工具来生成,使用和转换TensorFlow模型。

但是这种解释很抽象,并不能真正帮助我理解优点SavedModel。在SavedModel(而不是tf.train.Saver)更好使用的具体示例中有哪些?

请注意,我的问题不是这个问题的重复。我不是在问如何保存模型,而是在询问有关的属性的非常具体的问题SavedModel,这只是TensorFlow提供的保存和加载模型的多种机制之一。所链接的问题中的所有答案都没有涉及到SavedModelAPI(该API再次与相同tf.train.Saver)。

关注者
0
被浏览
135
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    编辑 :我在TensorFlow 1.4上写了这个。截至今天(TensorFlow
    1.12稳定,1.13rc和2.0即将来临),该问题中链接的文档已得到很大改进。


    我正在尝试使用,tf.saved_model并且还发现Docs非常(太)抽象。这是我对您问题的完整回答:

    1 . signature_def_map

    一种。
    格式
    参见Tom对Tensorflow的回答:如何保存/恢复模型。(Ctrl-F对于“
    tf.saved_model”-当前,该短语在该问题上的唯一用法是在他的答案中)。

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

    2 . assets_collection

    格式:
    找不到清晰的文档,所以我去了构建器源代码。看来,该参数是的张量的迭代dtype=tf.string,其中每个张量是资产目录的路径。因此,一个TensorFlow
    Graph集合应该工作。我想这是参数的名字,但是从源代码中我希望Python也list能工作。

    (您不是问是否 需要
    设置它,而是从Zoe对tensorflow中有什么资产的答案以及iga对与切向相关的Tensorflow服务的答案判断:导出模型时“没有要保存/写入的资产”,它不是。通常需要设置。)

    3.标签:

    一种。 为什么选择列表我不知道为什么您 必须
    传递一个列表,但是您可以传递带有一个元素的列表。例如,在我当前的项目中,我仅使用[tf...tag_constants.SERVING]标签。

    b。
    何时使用多个
    说,您使用显式设备放置进行操作。也许您想保存图形的CPU版本和GPU版本。显然,您想保存每个服务版本,并说要保存训练检查点。您可以使用CPU
    /
    GPU标签和培训/服务标签来管理所有情况。该文档暗示吧:

    添加到SavedModel的每个MetaGraphDef必须使用用户指定的标签进行注释。标签提供了一种方法来标识要加载和还原的特定MetaGraphDef,以及共享的变量和资产集。这些标签通常使用其功能(例如,服务或培训)以及可选的特定于硬件的方面(例如,GPU)来注释MetaGraphDef。

    C。 冲突我 太懒惰,无法强迫自己发生冲突-我看到了两个需要解决的情况-
    我去了加载程序源代码。在内部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`"
      )
    

    在我看来,它正在寻找完全匹配的东西。例如,说您有一个带有标签“ GPU”和“ Serving”的图元以及一个带有标签“
    Serving”的图元。如果您加载“服务”,则将获得后一个元数据。另一方面,假设您有一个图元“ GPU”和“服务”以及一个图元“
    CPU”和“服务”。如果您尝试加载“服务”,则会收到错误消息。如果您尝试将两个具有完全相同标签的元图保存在同一文件夹中,那么我希望您会覆盖第一个。看起来构建代码无法以任何特殊方式处理此类冲突。

    4.SavedModeltf.train.Saver

    这也使我困惑。wicke的答案TensorFlow用户应该更喜欢SavedModel而不是Checkpoint或GraphDef?为我清理了。我将投入两分钱:

    在本地Python +
    TensorFlow的范围内,您可以tf.train.Saver做所有事情。但是,这将花费您。让我概述一下保存经过训练的模型和部署的用例。您将需要您的保护程序对象。设置它以保存完整的图形(每个变量)最简单。.meta由于使用静态图,您可能不想一直节省时间。您需要在训练挂钩中指定。您可以在cv-
    tricks上
    阅读有关内容。培训结束后,您需要将检查点文件转换为pb文件。这通常意味着清除当前图形,还原检查点,使用将对象冻结为常量tf.python.framework.graph_util并将其写入tf.gfile.GFile。您可以在媒体上阅读。之后,您想要在Python中部署它。您将需要输入和输出Tensor名称-
    图形def中的字符串名称。您可以在metaflow上 阅读有关内容
    (实际上是该tf.train.Saver方法的非常不错的博客文章)。一些op节点可让您轻松地将数据输入其中。有些没有那么多。我通常会放弃寻找合适的节点,并添加了一个tf.reshape实际上并未重塑图形def的节点。那是我的临时输入节点。输出相同。最后,您可以至少在Python中本地部署模型。

    或者,您可以使用我在第1点中链接的答案来通过SavedModelAPI完成所有这些操作。汤姆的回答使头痛减轻了。如果有适当的文件记载,将来您将获得更多的支持和功能。看起来,使用命令行服务更容易(中型链接涵盖了这样做Saver-看起来很艰难,祝您好运!)。它实际上已经加入了新的估算器。根据文档,

    SavedModel是一种与 语言 无关的,可恢复的,密封的序列化格式。

    我的重点:看起来您可以轻松地将训练有素的模型添加到不断发展的C ++ API中。

    我的看法就像Datasets API。这比旧方法 容易

    至于具体的例子SavedModeltf.train.Saver:如果“基本上,当你想保存或恢复模式”是不是因为你不够清楚:使用它是它使您的生活更轻松随时正确的时间。对我来说,这看起来总是一样。尤其是在使用Estimators,以C
    ++进行部署或使用命令行服务的情况下。

    这就是我对您的问题的研究。或四个列举的问题。错误,八个问号。希望这可以帮助。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看