Keras单目标检测训练报Shapes of all inputs must match错误如何解决
问题原因
- 度量指标选择错误:你的任务是单目标检测的边界框回归(输出4个坐标值,属于回归任务),但在
model.compile里指定了MeanIoU(num_classes=2)作为评估指标。MeanIoU是针对语义分割、分类任务设计的指标,要求输入的真实标签和预测输出是类别掩码或类别值,内部会计算混淆矩阵。你的回归输出是形状为(batch_size,4)的坐标,标签是你临时填充的形状为(batch_size,1)的0值,完全不符合MeanIoU的输入要求,这是报错里confusion_matrix节点形状不匹配的直接原因。
你观察到的BATCH_SIZE变化时错误数值对应变化:BATCH_SIZE=16时不匹配维度为16和64(164),BATCH_SIZE=8时为8和32(84),刚好对应模型输出的第二维长度为4,进一步验证了形状不匹配来自回归输出和分类指标的输入要求冲突。 - 标签数据错误:构造DataFrame时你给
coordinates列直接填了固定值0,这是无效标签。边界框回归任务需要每个样本对应4个坐标值(比如归一化后的xmin、ymin、xmax、ymax,或者中心点+宽高),且因为你输出层用了sigmoid激活,坐标值需要提前缩放到0~1区间,当前的单值0标签不仅无法完成训练,也是形状不匹配的次要原因。 - 模型结构逻辑错误:你搭建卷积特征提取层的循环存在逻辑问题,每次循环都从
input_img开始重新计算特征,等于前两次的32、64通道卷积层完全没有生效,仅保留了最后一次128通道的卷积输出,会导致模型特征提取能力大幅下降。 - 早停回调配置错误:你配置EarlyStopping时监控的是
val_accuracy,回归任务没有准确率指标,会导致回调逻辑失效。
解决方案
- 替换适配回归任务的评估指标:删除MeanIoU,替换为MSE、MAE等回归指标,也可以自己实现边界框IoU计算函数作为自定义指标:
model.compile( loss="mse", optimizer=Adam(lr=0.0005), metrics=["mse", "mae"] ) - 修正标签数据:把每张图像对应的真实边界框4个归一化后的坐标值,存储到DataFrame的
coordinates列,每行的coordinates为长度为4的列表或数组。 - 修正卷积层循环逻辑:把x的初始化放到卷积循环外部,保证特征逐层传递:
def build_model(img_shape: Tuple[int, int, int]) -> Model: input_img = Input(shape=img_shape) x = input_img # 初始化特征变量 for k in [32,64,128]: x = BatchNormalization()(x) # 输入为上一层输出的特征,而非原始输入 x = Conv2D(filters=k, kernel_size=3, padding="same")(x) x = Activation("relu")(x) x = MaxPool2D()(x) # 后续代码保持不变 - 修正早停回调的监控指标:
early_stopping_callback = EarlyStopping( monitor="val_loss", patience=30, verbose=1, restore_best_weights=True, min_delta=0.0005 )
内容的提问来源于stack exchange,提问作者Move37
相关产品推荐
相关产品推荐

