为什么要用元图保存一个标签列表,而不是只给它一个名字(即只给它附加一个唯一的标签)?为什么我要向给定的元图添加多个标记?如果我试图通过某个标记从pb
加载一个元图形,但该pb
中的多个元图形与该标记匹配,该怎么办?
文档认为,建议使用savedmodel
将整个模型(而不是仅变量)保存在自包含的文件中。但是tf.train.saver
还将图形和变量保存在.meta
文件中。那么使用savedmodel
有什么好处呢?文件上说
当您想要保存和加载变量、图和图的元数据时--基本上,当您想要保存或还原模型时--我们建议使用SavedModel。SavedModel是一种与语言无关的、可恢复的、密封的序列化格式。SavedModel使更高级别的系统和工具能够生成、使用和转换TensorFlow模型。
请注意,我的问题并不是这个问题的重复。我不是在问如何保存模型,我是在问关于savedmodel
属性的非常具体的问题,它只是TensorFlow为保存和加载模型提供的多种机制之一。链接问题中的答案没有一个涉及savedmodel
API(该API与tf.train.saver
)不同)。
编辑:这是我在TensorFlow 1.4上写的。到今天为止(TensorFlow 1.12是稳定的,有1.13RC和2.0即将到来),问题中链接的文档有了很大的改进。
我尝试使用tf.saved_model
,并且发现文档相当抽象。以下是我对你的问题的完整回答:
a.格式参见Tom对TensorFlow的回答:如何保存/还原模型。(Ctrl-F
表示“tf.saved_model”-目前,该短语在该问题上的唯一用法是在他的回答中)。
添加到SavedModel的每个MetaGraphDef都必须使用用户指定的标记进行注释。标记提供了一种方法来标识要加载和还原的特定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”的元图。如果加载“serving”,将得到后一个元图。另一方面,假设你有一个元图“GPU”和“服务”,还有一个元图“CPU”和“服务”。如果你尝试加载“服务”,你会得到错误。如果您试图在同一个文件夹中保存两个带有完全相同标记的元图,我希望您会覆盖第一个。构建代码似乎没有以任何特殊的方式处理这样的冲突。
SavedModel是一种与语言无关的、可恢复的、密封的序列化格式。
强调我的:看起来你可以更容易地将你训练的模型加入到不断增长的C++API中。
在我看来,它就像Datasets API。只是比老办法容易!
我这么说是因为来自avro的POJO一代不是那么直截了当的。在此基础上,它需要maven插件和一个.avsc文件。 例如,我在我的Kafka制作人上创建了一个POJO,名为User: 我连载它,并发送到我的用户主题在Kafka。然后我有一个消费者,它本身有一个POJO用户,并反序列化消息。是空间问题吗?这样序列化和反序列化不是也更快吗?更不用说维护模式注册表的开销了。
许多用户认为这是切换到 Pytorch 的原因,但我还没有找到牺牲最重要的实际质量、速度来换取急切执行的理由/解释。 下面是代码基准测试性能,TF1与TF2-TF1的运行速度从47%到276%不等。 我的问题是:在图形或硬件级别,是什么导致了如此显着的减速? 寻找详细的答案-我已经熟悉广泛的概念。相关Git 规格:CUDA 10.0.130、cuDNN 7.4.2、Python 3.7.4、Win
如何在Python 3.6 x64中使用TensorFlow GPU版本而不是CPU版本? Python正在使用我的CPU进行计算 我可以注意到,因为我有一个错误: 您的CPU支持该TensorFlow二进制文件未编译使用的指令:AVX2 我已经安装了tensorflow和tensorflow gpu。 如何切换到GPU版本?
为什么? 何时应该在项目中使用? 我知道这是为了将所有数据库更改保持在一个地方,但类似的做法也可以通过在某个存储库系统中创建一个简单的文件并随时间不断更新来实现。
我目前正在研究单图像超分辨率,我设法冻结了一个现有的检查点文件,并将其转换为tensorflow lite。然而,当使用.tflite文件执行推断时,对一个图像进行上采样所需的时间至少是使用.ckpt文件恢复模型时的4倍。 使用. ckpt文件的推理使用session.run()完成,而使用. tflite文件的推理使用interpreter.invoke()完成。这两个操作都是在典型PC上运行的
有更多经验的人可以通过发现和分享使用TensorFlow的C++API的指南来提供帮助吗?