gpt4 book ai didi

python - TensorFlow:如何以及为何使用 SavedModel

转载 作者:IT老高 更新时间:2023-10-28 22:12:06 31 4
gpt4 key购买 nike

我有几个关于 SavedModel 的问题API,其documentation我发现很多细节无法解释。

前三个问题是关于传递给 add_meta_graph_and_variables() 的参数的内容。 tf.saved_model.builder.SavedModelBuilder的方法,而第四个问题是关于为什么要使用 SavedModel API 结束 tf.train.Saver .

  • signature_def_map的格式是什么争论?保存模型时我通常需要设置这个参数吗?
  • 同样,assets_collection的格式是什么?争论?
  • 为什么要保存带有元图的标签列表而不是只给它一个名称(即只附加一个唯一的标签)?为什么要向给定的元图添加多个标签?如果我尝试从 pb 加载元数据会怎样?由某个标签,但其中有多个元图 pb匹配那个标签?
  • 该文档认为建议使用 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 提供的用于保存和加载模型的多种机制之一。链接问题中的所有答案均未涉及 SavedModel API(再次与 tf.train.Saver 不同)。

    最佳答案

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

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

    1. signature_def_map :

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

    湾需要我的理解是你通常需要它。如果您打算使用该模型,您需要知道图形的输入和输出。我认为它类似于 C++ 函数签名:如果您打算在调用后或在另一个 C++ 文件中定义一个函数,则需要在主文件中(即原型(prototype)或头文件)中的签名。

    2. assets_collection :

    格式:找不到明确的文档,所以我去了 build 者 source code .该参数似乎是 dtype=tf.string 的张量的可迭代对象。 ,其中每个张量是 Assets 目录的路径。所以,一个 TensorFlow Graph collection应该管用。我想这是参数的同名,但从源代码我希望 Python list也去工作。

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

    3. 标签:

    一种。为什么要上榜 我不知道为什么你必须传递一个列表,但你可以传递一个包含一个元素的列表。例如,在我当前的项目中,我只使用 [tf...tag_constants.SERVING]标签。

    湾何时使用多个 假设您使用显式设备放置进行操作。也许您想保存图形的 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`"
    )

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

    4. SavedModeltf.train.Saver :

    这也让我很困惑。 wicke 对 Should TensorFlow users prefer SavedModel over Checkpoint or GraphDef? 的回答为我清除了它。我会投入我的两分钱:

    在本地Python+TensorFlow范围内,可以做 tf.train.Saver做任何事。但是,这会让你付出代价。让我概述保存训练模型和部署用例。您将需要您的保护程序对象。将其设置为保存完整图形(每个变量)是最简单的。您可能不想保存 .meta自从您使用静态图以来,一直都是如此。你需要在你的训练 Hook 中指定它。您可以阅读有关此内容的信息 on cv-tricks .训练完成后,您需要将检查点文件转换为 pb文件。这通常意味着清除当前图形、恢复检查点、使用 tf.python.framework.graph_util 将变量卡住为常量。 , 并用 tf.gfile.GFile 书写.您可以阅读有关此内容的信息 on medium .之后,您想在 Python 中部署它。您将需要输入和输出张量名称 - 图 def 中的字符串名称。您可以阅读有关此内容的信息 on metaflow (实际上是关于 tf.train.Saver 方法的非常好的博文) .一些 op 节点可以让您轻松地向其中输入数据。有些没有那么多。我通常放弃寻找合适的节点并添加一个 tf.reshape这实际上并没有对图形定义进行任何重塑。那是我的临时输入节点。输出也一样。最后,您可以部署您的模型,至少可以在 Python 本地部署。

    或者,您可以使用我在第 1 点中链接的答案通过 SavedModel 完成所有这些操作。应用程序接口(interface)。多亏了汤姆的回答,头痛减少了。如果得到适当的记录,您将来将获得更多支持和功能。看起来使用命令行服务更容易(中等链接涵盖了使用 Saver 执行此操作 - 看起来很难,祝你好运!)。它实际上已经融入了新的 Estimator。根据文档,

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



    强调我的:看起来您可以更轻松地将经过训练的模型放入不断增长的 C++ API。

    在我看来,它就像 Datasets API。它只是比旧方法更容易!

    至于 SavedModel的具体例子的 tf.train.Saver :如果“基本上,什么时候要保存或恢复模型”对您来说还不够清楚:使用它的正确时间是任何时候都可以让您的生活更轻松。对我来说,这看起来像往常一样。特别是如果您使用 Estimators、在 C++ 中部署或使用命令行服务。

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

    关于python - TensorFlow:如何以及为何使用 SavedModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46513923/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com