为何调用predict_on_batch时,不同batch size的输入返回相同长度输出?
问题原因与解决办法
核心原因
- 你使用的YOLOv3 Keras实现本身就是多输出结构,
predict_on_batch接口在处理多输出模型时,会返回与模型输出头数量一致的结果列表,列表长度和输入batch size没有关联,你观测到的len(output)=2就是模型的2个检测输出头的数量。 - 你的测试代码仅打印了输出列表的长度,没有打印列表内每个张量的具体形状,因此误将输出头的数量判定为和batch相关的输出维度。实际上列表内每个张量的第一维就是对应的batch size:输入1个样本时每个张量第一维为1,输入5个样本时每个张量第一维为5。
解决方法
你可以直接访问输出列表内的每个张量获取对应batch的检测结果,示例代码如下:
# 单样本输入测试 input_batch = tf.ones((1,416,416,3)) output = model.predict_on_batch(input_batch) print(output[0].shape) # 第一个检测头输出,shape第一维为1 print(output[1].shape) # 第二个检测头输出,shape第一维为1 # 5样本输入测试 input_batch = tf.ones((5,416,416,3)) output = model.predict_on_batch(input_batch) print(output[0].shape) # 第一个检测头输出,shape第一维为5 print(output[1].shape) # 第二个检测头输出,shape第一维为5
如果你需要得到(batch_size, a, b)格式的统一输出,可以结合YOLO的后处理逻辑,对多个检测头的输出做合并、非极大值抑制(NMS)操作,过滤无效检测框后即可得到第一维为batch size的最终检测结果。
内容的提问来源于stack exchange,提问作者Sid Anand
相关产品推荐
相关产品推荐

