You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:40:28