Tensorboard获取张量名及TensorFlow模型get_tensor_by_name调用失败问题
嘿,我来帮你解决这个问题!你遇到的这个情况在加载预训练TensorFlow PB模型时特别常见,核心问题出在张量名称的细节和模型加载的正确流程上,我给你一步步拆解:
1. 为什么get_tensor_by_name()会失败?
TensorBoard里显示的image_tensor是节点名称,但get_tensor_by_name()需要的是张量的完整名称——每个节点的输出张量默认会在节点名后加上:0(如果一个节点有多个输出张量,会依次是:0、:1...)。所以你应该用image_tensor:0作为参数,而不是单纯的image_tensor。
2. 正确加载模型并调用张量的流程
你可能没正确完成PB模型的导入步骤,下面是完整的可运行示例代码,适配ssd_mobilenet_v2_coco模型:
import tensorflow as tf import cv2 import numpy as np def one_image(im_path, model_path): # 1. 读取PB模型文件 with tf.gfile.GFile(model_path, 'rb') as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) # 2. 创建会话并导入图定义 with tf.Session() as sess: # 直接指定要导入的输入输出张量,避免名称查找出错 imported_tensors = tf.import_graph_def( graph_def, return_elements=[ 'image_tensor:0', # 输入张量 'detection_boxes:0', # 检测框坐标 'detection_scores:0', # 置信度 'detection_classes:0' # 类别ID ] ) # 3. 取出对应的张量 image_input = imported_tensors[0] boxes = imported_tensors[1] scores = imported_tensors[2] classes = imported_tensors[3] # 4. 预处理输入图像(SSD模型要求RGB格式,形状为[1, height, width, 3],像素值0-255) img = cv2.imread(im_path) img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_expanded = np.expand_dims(img_rgb, axis=0) # 5. 运行推理 result_boxes, result_scores, result_classes = sess.run( [boxes, scores, classes], feed_dict={image_input: img_expanded} ) # 示例:打印置信度>0.5的检测结果 for idx in range(len(result_scores[0])): if result_scores[0][idx] > 0.5: print(f"类别ID: {result_classes[0][idx]}, 置信度: {result_scores[0][idx]:.2f}, 坐标: {result_boxes[0][idx]}")
3. 额外排查点
- 如果还是找不到张量,去TensorBoard的Graph页面,点击
image_tensor节点,查看它的输出张量的完整名称(比如是否带有前缀,如果你导入模型时指定了name参数,张量名会带上这个前缀)。 - 确认你的PB模型路径正确,没有读错文件(可以加个判断:
assert tf.gfile.Exists(model_path), "模型文件不存在!")。
内容的提问来源于stack exchange,提问作者Ericccccc
相关产品推荐
相关产品推荐

