PyTorch基于BERT二分类时nn.CrossEntropyLoss Target 2越界报错排查
问题原因
- 你的二分类任务模型最后一层输出维度为2,对应类别索引必须为0和1,但从dataloader的打印结果可以看到你的标签值是
1和2,当损失函数计算遇到值为2的标签时,会尝试索引模型输出的第3个位置(索引从0开始计数),超出了输出维度范围,所以抛出Target 2 is out of bounds错误。 - 额外注意:你在模型最后一层
linear2后面加了ReLU激活是不合理的,nn.CrossEntropyLoss要求输入是原始logits,不需要额外加激活层,ReLU会截断负值的logits,会影响模型的收敛效果。
修复方案
- 调整数据集标签映射,在自定义Dataset的
__getitem__方法中修改标签值:
# 原代码 sentiment = int(self.df['sentiment'].iloc[index]) # 改为 sentiment = int(self.df['sentiment'].iloc[index]) - 1
这样原来的标签1会转为0,标签2转为1,刚好适配二分类的标签范围。
2. 移除模型最后一层的ReLU激活:
# 原代码 x = self.relu2(self.linear2(x)) return x # 改为 x = self.linear2(x) return x
内容的提问来源于stack exchange,提问作者dev1ce
相关产品推荐
相关产品推荐

