TensorFlow Lite在Android端推理报错:索引0输出张量应为3维实际为2维
报错根因
这个报错的核心原因是你导出的TFLite模型输出维度不符合TensorFlow Lite Task Library ObjectDetector接口的输入输出约定,官方Demo用的ObjectDetector要求模型输出的四个张量必须是[batch, num_detections, ...]的3维结构,你导出的模型默认输出了不带batch维度的2维结构,所以触发维度校验失败。
修复步骤
- 第一步:修改模型导出配置,打开你转换模型的Colab笔记本,找到TFLite导出的代码段,找到对应导出函数的参数配置,手动开启
include_detection_batch_dim = True参数,这个参数会强制给所有输出张量加上batch维度,把2维输出补为符合要求的3维结构。 - 第二步:校验导出模型的输出维度,导出完成后可以用如下Python代码确认维度是否符合要求:
import tensorflow as tf interpreter = tf.lite.Interpreter(model_path="你的自定义模型路径.tflite") interpreter.allocate_tensors() output_details = interpreter.get_output_details() for idx, output in enumerate(output_details): print(f"输出张量{idx}维度:{output['shape']}")
正常符合要求的输出维度应该是[1, 检测数, 4](检测框坐标)、[1, 检测数](类别ID)、[1, 检测数](置信度)、[1, 1](总检测数量)这类3维结构。
- 第三步:如果转换时开启了全整数量化,需要在转换配置中添加
converter.experimental_enable_resource_variables = True,同时设置converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS],避免量化过程自动折叠多余的batch维度导致维度降级。 - 第四步:替换模型到Android项目后,保持ObjectDetector初始化的默认配置即可,不要自行修改输出张量索引、维度映射相关的参数。
验证方法
重新打包运行App,模型转换正确的情况下初始化阶段不会再抛出维度不匹配的错误,可以正常加载模型执行推理。
内容的提问来源于stack exchange,提问作者iTzZCHIP
相关产品推荐
相关产品推荐

