在Mask RCNN中使用Class_weights处理不平衡数据集遇报错
解决Mask RCNN添加Class_Weights时的ValueError问题
错误根源
报错提示Unknown entries in class_weight dictionary: [0,1,...15]. Only expected following keys: [],本质是模型的分类层未正确关联你的自定义类别,导致Keras无法识别你传入的类别ID键,认为预期的类别集合为空。
分步解决方案
1. 检查数据集Config的类别配置
Mask RCNN依赖自定义Config类定义数据集参数,必须确保:
NUM_CLASSES设置正确:自定义类别数 + 1(背景类默认是ID 0)。比如你有15个自定义类别,需设置NUM_CLASSES = 16。- 类别ID从1开始连续编号,背景固定为0,和Config的
NUM_CLASSES对应。
2. 修正Class_Weights的键覆盖范围
Keras的class_weight要求键对应模型分类层的所有类别索引(从0到NUM_CLASSES-1):
- 背景类(ID 0)可设置权重为1.0(无需加权),自定义类别按你的样本数设置权重:
CLASS_WEIGHTS = {0:1.0, 1:600, 2:10, 3:5, ..., 15:xx} - 不要用列表/数组替代字典,除非你的类别索引是连续从0开始且长度等于
NUM_CLASSES,否则会匹配失败。
3. 确认class_weight的传递路径
你在model.py的train函数新增了class_weight参数,必须确保该参数最终传递到Keras底层训练接口:
- 找到
train函数中调用model.fit()或model.train_on_batch()的代码,将class_weight参数传入这些方法,比如:# 在model.py的训练循环中 loss = model.train_on_batch( inputs, outputs, class_weight=class_weight, # 确保传入这里 reset_metrics=False ) - 如果只是在
train函数中新增参数但未传递到Keras训练方法,等于无效传递,还会因模型未识别类别触发报错。
4. 验证模型分类层的正确性
打印模型分类层的输出形状,确认类别数匹配Config设置:
# 查看mrcnn分类层的输出形状 print(model.get_layer('mrcnn_class_logits').output_shape)
输出应为(None, None, NUM_CLASSES),比如(None, None, 16)对应15个自定义类别+背景。如果输出的类别数不对,说明模型用了默认Config(比如COCO的81类),需重新基于自定义Config构建模型。
5. 避坑提醒
- 自定义类别ID必须连续,不能跳号(比如不要出现1、3、4这种情况),否则模型分类层的索引和你的类别ID无法对齐。
- 训练前确保模型是基于你的自定义Config重新初始化的,而非复用预训练模型的默认Config。
内容的提问来源于stack exchange,提问作者Tima
相关产品推荐
相关产品推荐

