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
相关产品推荐
相关产品推荐

