BERT多标签分类报Target size与input size维度不匹配错误如何解决
问题核心原因
你当前使用BERT做5类多标签分类,损失函数采用BCEWithLogitsLoss,该损失要求标签维度必须和模型输出的logits维度完全一致。报错显示你的模型输出维度为[16, 5](batch大小为16,共5个分类类别),但传入的标签维度仅为[16],缺少类别维度,因此触发维度不匹配错误。
你仅修改了数据集文件名就出现该问题,大概率是数据加载阶段的标签预处理逻辑异常:
- 之前正常运行时,每个样本的标签是长度为5的0/1数组,对应5个类别的命中状态
- 现在加载的标签被处理为单个整数,适配的是单标签分类的格式,不符合多标签分类的输入要求;即使用旧数据集测试,也可能是预处理缓存被覆盖、或者修改文件名时误碰了数据加载的关联逻辑。
修复步骤
- 先验证标签维度:取训练集dataloader的第一个batch,打印
batch[2].shape,确认当前标签维度确实为torch.Size([16])而非预期的torch.Size([16, 5]) - 若确实是多标签分类任务:修正标签预处理逻辑,将每个样本的标签转换为长度为5的0/1数组,比如某样本命中第0、2类,标签就设置为
[1,0,1,0,0] - 若实际是单标签5分类任务:修改模型初始化参数,将
problem_type从multi_label_classification改为single_label_classification,框架会自动切换为适配单标签的交叉熵损失,即可适配[16]维度的标签 - 额外检查:确认初始化
BertForSequenceClassification时,num_labels参数设置为5,和实际类别数一致
内容的提问来源于stack exchange,提问作者Jim Jones
相关产品推荐
相关产品推荐

