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

PyTorch NLP模型报错RuntimeError:预期标量类型Long却发现Float求助

PyTorch多分类模型RuntimeError问题排查

问题描述

基于PyTorch开发NLP多分类模型,运行时触发RuntimeError: expected scalar type Long but found Float,错误出现在调用model(labels)的代码行(第18行)。已尝试将labels转为torch.LongTensor但问题未解决,需排查错误指向的变量及损失函数是否存在问题。

报错堆栈

16     labels=labels.type(torch.LongTensor)
17     print(labels.type())
---> 18     outputs= model(labels)
19     loss=criterion(outputs.type(torch.LongTensor), labels)
20     optimizer.zero_grad()

3 frames
/usr/local/lib/python3.10/dist-packages/torch/nn/modules/linear.py in forward(self, input)
    112 
    113     def forward(self, input: Tensor) -> Tensor:
--> 114         return F.linear(input, self.weight, self.bias)
    115 
    116     def extra_repr(self) -> str:

RuntimeError: expected scalar type Long but found Float

训练代码

learning_rate=0.01
output_size=len(products)
num_epochs=5
hidden_size=50
input_size=len(all_words)

criterion=nn.CrossEntropyLoss()
model=NeuralNet(input_size,hidden_size,output_size)
optimizer=torch.optim.Adam(model.parameters(),lr=learning_rate)
#since it is multiclass

for epoch in range(num_epochs):
  for (words, i) in xy:
    labels=bag_of_words(words,all_words)
    labels=torch.from_numpy(labels)
    labels=labels.type(torch.LongTensor)
    print(labels.type())
    outputs= model(labels)
    loss=criterion(outputs.type(torch.LongTensor), labels)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

问题分析与解决

1. 错误指向的变量

错误直接指向你传入模型的labels变量,但核心问题是变量名混淆:这里的labels其实是词袋模型生成的输入特征,而非分类任务的目标标签。

PyTorch的线性层(nn.Linear)默认权重为FloatTensor类型,它期望输入特征也是Float类型,但你把这个输入特征强行转成了LongTensor,导致线性层计算时类型不匹配,触发报错。

2. 损失函数的问题

损失函数nn.CrossEntropyLoss有明确的类型要求:

  • 第一个参数:模型输出的logits,必须是FloatTensor类型
  • 第二个参数:目标标签,必须是LongTensor类型

你把outputs转成LongTensor完全错误,既违背了损失函数的输入要求,也会导致计算时类型不匹配。

3. 修正后的代码

learning_rate=0.01
output_size=len(products)
num_epochs=5
hidden_size=50
input_size=len(all_words)

criterion=nn.CrossEntropyLoss()
model=NeuralNet(input_size,hidden_size,output_size)
optimizer=torch.optim.Adam(model.parameters(),lr=learning_rate)

for epoch in range(num_epochs):
  for (words, label_idx) in xy:
    # 词袋特征转FloatTensor(匹配模型线性层权重类型)
    features = torch.from_numpy(bag_of_words(words, all_words)).type(torch.FloatTensor)
    # 真实标签转LongTensor(满足分类任务目标类型要求)
    labels = torch.tensor(label_idx, dtype=torch.long)
    
    outputs = model(features)
    # 直接传入符合类型要求的参数,无需额外转换
    loss = criterion(outputs, labels)
    
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

关键修正点

  • 重命名变量:将原错误的labels(输入特征)改为features,循环中的i(真实标签)改为label_idx,避免混淆
  • 输入特征用FloatTensor:匹配模型线性层的权重类型
  • 真实标签用LongTensor:满足CrossEntropyLoss的目标类型要求
  • 移除outputs的类型转换:保留模型输出的Float类型,符合损失函数输入规范

内容的提问来源于stack exchange,提问作者Sruts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:37:23