如何解决表面缺陷检测时logits与labels不可广播的InvalidArgumentError报错
报错本质
你遇到的logits and labels must be broadcastable报错核心原因是模型最终输出的类别数量和训练数据的标签类别数量不匹配:你当前模型最后一层输出维度是198,而训练集生成的标签维度是3,二者维度不一致无法计算交叉熵损失。
代码存在的具体问题
- 路径不匹配错误:你用
flow_from_directory读取训练集的路径和用glob统计类别数的路径是两个完全不同的目录,flow_from_directory从第一个路径下识别到3个类别,而glob从第二个路径下统计到198个条目,直接导致输出层维度和标签维度不匹配。 - 数据集结构不符合要求:
flow_from_directory是Keras针对监督分类任务设计的数据读取接口,要求数据集根目录下每个子文件夹对应一个类别,子文件夹内存放对应类别的标注图片。你将所有未标注图片放在同一个文件夹的用法完全不符合该接口的要求,无法生成正确的标签。 - 方案适配错误:你当前使用的VGG16微调+交叉熵损失是监督训练方案,必须依赖标注数据,用未标注数据无法执行该训练流程。
- 代码笔误:你统计类别数的glob路径里多了一个无效的反引号:
/ai-dataset-training-100/`,会导致路径读取错误。
解决方案
如果你打算继续使用监督训练方案
- 先整理数据集结构:确认你的缺陷检测任务需要分多少个类别(比如有裂缝/无裂缝是2类,裂缝/脱落/完好是3类),在数据集根目录下建立对应数量的子文件夹,将标注好的图片分别放入对应类别的子文件夹中。
- 统一所有路径:将
flow_from_directory的数据集路径和glob统计类别数的路径修改为同一个数据集根目录,同时删掉glob路径里的多余反引号。 - 验证维度匹配:训练前先打印两个值确认一致:
# 打印数据集识别的类别数 print("数据集类别数:", training_data.num_classes) # 打印统计的类别数 print("统计的类别数:", len(folder_count))
二者数值完全一致才能启动训练。
如果你只有未标注数据,无法做标注
直接放弃当前的监督训练方案,改用无监督异常检测类方案实现缺陷检测,比如训练自编码器学习正常墙面的特征,推理时特征重构误差大于阈值就判定为存在缺陷。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

