在张量流中将 SSD 转换为冻结图。必须使用哪些输出节点名称?

Posted

技术标签:

【中文标题】在张量流中将 SSD 转换为冻结图。必须使用哪些输出节点名称?【英文标题】:Converting SSD to frozen graph in tensorflow. Which output node names must be used? 【发布时间】:2017-12-14 12:02:03 【问题描述】:

我使用TensorFlow Object Detection API 训练SSD,如here 所述。它产生一个ckpt、元和索引文件。为了在我的图像上运行它,我尝试检查演示代码。它要求将模型转换为冻结图。如here 所述,我尝试将我的模型转换为冻结推理图。在该程序中,我必须提供输出节点名称。我无法确定必须在此处使用的 SSD 模型中的节点名称。请帮忙。我试过 'num_detections:0'、'detection_boxes:0' 等。只是得到错误:

AssertionError: num_detections 不在图中

【问题讨论】:

【参考方案1】:

我们有一个特殊的工具可以在 Tensorflow 对象检测 API 中转换为冻结图 --- 只需运行 export_inference_graph.py 二进制文件。使用此工具的说明是here。

【讨论】:

【参考方案2】:

您可以自行探索图形:A Tool Developer's Guide to TensorFlow Model Files 并查找节点名称。我可以从我的模型中给出样本:“prefix/digit1/Softmax:0”(在我的 keras 模型中是“digit1”) 另外,我记得您应该将这些名称的列表提供给 transform_graph 实用程序(“--output”参数)。

【讨论】:

【参考方案3】:

我正在使用这个小 Python 脚本根据其操作来本地化节点。 “PLaceholder”和“Identity”似乎对查找输入和输出节点很有趣:

import tensorflow as tf

NODE_OPS = ['Placeholder','Identity']
MODEL_FILE = '/path/to/frozen_inference_graph.pb'

gf = tf.GraphDef()
gf.ParseFromString(open(MODEL_FILE,'rb').read())

print([n.name + '=>' +  n.op for n in gf.node if n.op in (NODE_OPS)])

【讨论】:

以上是关于在张量流中将 SSD 转换为冻结图。必须使用哪些输出节点名称?的主要内容,如果未能解决你的问题,请参考以下文章

在 Tensorflow C++ 中将浮点向量传递给张量

在张量流代码中将标量标记为一个热点?

如何找出冻结的张量流图的正确输入和输出操作?

将冻结图转换为 tensorflow-js 格式

在 Android 上使用来自冻结的张量流图的变量

在张量流中导入图形时使用新操作