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

TensorFlow:如何以及为什么使用SavedModel,第1张

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

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

defload
,您将看到:

saved_model = _parse_saved_model(export_dir)found_match = Falsefor 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    breakif 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.
SavedModel
tf.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点中链接的答案来通过

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

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

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

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

至于具体的例子

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

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



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5587818.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存