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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 18:15:01