给定一个张量流模型图,如何找到输入节点和输出节点名称

2024-03-23

我在张量流相机演示中使用自定义模型进行分类。 我生成了一个 .pb 文件(序列化的 protobuf 文件),我可以显示它包含的巨大图表。 将此图转换为优化图,如[中给出https://www.oreilly.com/learning/tensorflow-on-android] https://www.oreilly.com/learning/tensorflow-on-android%5D,可以使用以下过程:

$ bazel-bin/tensorflow/python/tools/optimize_for_inference  \
--input=tf_files/retrained_graph.pb \
--output=tensorflow/examples/android/assets/retrained_graph.pb
--input_names=Mul \
--output_names=final_result

这里如何从图形显示中找到 input_names 和 output_names。 当我不使用正确的名称时,我会遇到设备崩溃:

E/TensorFlowInferenceInterface(16821): Failed to run TensorFlow inference 
with inputs:[AvgPool], outputs:[predictions]

E/AndroidRuntime(16821): FATAL EXCEPTION: inference

E/AndroidRuntime(16821): java.lang.IllegalArgumentException: Incompatible 
shapes: [1,224,224,3] vs. [32,1,1,2048]

E/AndroidRuntime(16821):     [[Node: dropout/dropout/mul = Mul[T=DT_FLOAT, 
_device="/job:localhost/replica:0/task:0/cpu:0"](dropout/dropout/div, 
dropout/dropout/Floor)]]

尝试这个:

运行Python

>>> import tensorflow as tf
>>> gf = tf.GraphDef()
>>> gf.ParseFromString(open('/your/path/to/graphname.pb','rb').read())

and then

>>> [n.name + '=>' +  n.op for n in gf.node if n.op in ( 'Softmax','Placeholder')]

然后,你可以得到类似这样的结果:

['Mul=>Placeholder', 'final_result=>Softmax']

但我不确定这是关于错误消息的节点名称的问题。 我猜您在加载图形文件时提供了错误的论点,或者您生成的图形文件有问题?

检查这部分:

E/AndroidRuntime(16821): java.lang.IllegalArgumentException: Incompatible 
shapes: [1,224,224,3] vs. [32,1,1,2048]

UPDATE:对不起, 如果您正在使用(重新)训练的图表,请尝试以下操作:

[n.name + '=>' +  n.op for n in gf.node if n.op in ( 'Softmax','Mul')]

似乎(重新)训练的图将输入/输出操作名称保存为“Mul”和“Softmax”,而优化和/或量化的图将它们保存为“Placeholder”和“Softmax”。

BTW,根据 Peter Warden 的帖子,不建议在移动环境中使用重新训练的图:https://petewarden.com/2016/09/27/tensorflow-for-mobile-poets/ https://petewarden.com/2016/09/27/tensorflow-for-mobile-poets/。由于性能和文件大小问题,最好使用量化或内存映射图,但我无法找到如何在 Android 中加载内存映射图...:( (在android中加载优化/量化图没有问题)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

给定一个张量流模型图,如何找到输入节点和输出节点名称 的相关文章

随机推荐