PyTorch运行HuggingFace教程时出现张量类型错误如何解决
问题排查与解决指南
核心根因
当你将num_labels设为1时,Hugging Face的BertForSequenceClassification会默认启用MSELoss作为损失函数,该损失要求输入标签为浮点类型,但SST2数据集原生标签是torch.int64(Long类型),类型不匹配触发报错。你之前修改input_ids、attention_mask的类型没有效果,是因为冲突发生在损失计算的标签输入环节,而非模型输入环节。此外,input_ids、attention_mask本身设计为Long类型输入给BERT嵌入层,转换为浮点反而可能引发其他异常,建议改回默认Long类型。
分步排查步骤
- 验证损失函数类型:执行
print(model.loss_fct),如果输出为MSELoss()即可确认触发该场景 - 检查标签数据类型:训练循环中打印batch内标签的dtype,执行
print(labels.dtype),如果输出为torch.int64即可确认类型冲突点 - 排除其他异常:确认模型输出的logits类型为
torch.float32,该类异常在官方transformers实现中极少出现
两种可选解决方法
方案1:适配MSELoss调整标签类型
不修改模型结构,仅在损失计算前将标签转换为浮点类型即可。
如果是自定义训练循环,在取出batch的labels后添加转换代码:
labels = labels.float()
如果使用Trainer API训练,可在数据集预处理的map阶段直接将标签列转换为float类型,或自定义data collator完成转换。
方案2:切换为更适配二分类的交叉熵损失
SST2是标准二分类任务,使用交叉熵损失训练效果更优,仅需将初始化模型时的num_labels参数从1改为2即可。此时模型会自动启用CrossEntropyLoss,该损失原生支持Long类型的0/1标签,无需修改任何数据类型。
内容的提问来源于stack exchange,提问作者NoIdea
相关产品推荐
相关产品推荐

