TensorFlow:如何以及为什么使用SavedModel
我对SavedModel
API有一些疑问,我发现其文档留下了许多无法解释的细节。
前三个问题是关于将什么传递给add_meta_graph_and_variables()
方法的参数tf.saved_model.builder.SavedModelBuilder
,而第四个问题是关于为什么要在SavedModel
API上使用API
tf.train.Saver
。
-
signature_def_map
参数的格式是什么?保存模型时,通常需要设置此参数吗? -
同样,
assets_collection
参数的格式是什么? -
为什么只用一个元符号保存一个标签列表,而不是仅仅给它一个名字(即,只附加一个唯一的标签)?为什么要在给定的元图中添加多个标签?如果我尝试
pb
通过某个标签从a加载metagrpah ,但是pb
该标签中的多个图元与该标签匹配,该怎么办? -
该文档指出,建议使用
SavedModel
整个模型(仅与变量相对)保存在独立文件中。但tf.train.Saver
也节省了除了在一个变量中的图形.meta
文件。那么,使用的好处是SavedModel
什么?该文件说
当您要保存和加载变量,图形以及图形的元数据时(基本上,当您要保存或恢复模型时),建议使用SavedModel。SavedModel是一种与语言无关的,可恢复的,密封的序列化格式。SavedModel支持更高级的系统和工具来生成,使用和转换TensorFlow模型。
但是这种解释很抽象,并不能真正帮助我理解优点SavedModel
。在SavedModel
(而不是tf.train.Saver
)更好使用的具体示例中有哪些?
请注意,我的问题不是这个问题的重复。我不是在问如何保存模型,而是在询问有关的属性的非常具体的问题SavedModel
,这只是TensorFlow提供的保存和加载模型的多种机制之一。所链接的问题中的所有答案都没有涉及到SavedModel
API(该API再次与相同tf.train.Saver
)。
-
编辑 :我在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.
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
++进行部署或使用命令行服务的情况下。这就是我对您的问题的研究。或四个列举的问题。错误,八个问号。希望这可以帮助。