如何解决Pytorch - 运行时错误:标量类型为 Long 的预期对象,但在调用 _thnn_nll_loss_forward
我正在尝试使用 PyTorch 进行一些实验,在那里我创建了自己的输入和目标。我将这些输入提供给模型(这是一个具有 2 个隐藏层的基本 ANN,没有错)。但由于某种原因,我无法计算 CrossEntropyLoss()。我不知道为什么。我知道 StakcOverflow 上的一些其他问题与我的标题相同或有类似的问题。我已经经历过,但对我来说没有任何效果。很多人对数据集有问题,这似乎不是我的问题。
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
class Net(nn.Module):
def __init__(self) -> None:
super(Net,self).__init__()
self.layer1 = nn.Linear(2,10)
self.layer2 = nn.Linear(10,1)
def forward(self,x):
x = F.relu(self.layer1(x))
x = self.layer2(x)
return x
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = Net().to(device=device)
loss_fn = nn.CrossEntropyLoss()
learning_rate = 1e-3
epochs = 20
optimizer = optim.Adam(model.parameters(),lr=learning_rate)
inputs = torch.Tensor([
[0,0],[0,1],[1,1]
],).to(device=device)
targets = torch.Tensor([
0,1,0
]).to(device=device)
model.train()
for epoch in range(epochs):
pred_output = model(inputs)
print(pred_output.dtype)
print(targets.dtype)
loss = loss_fn(pred_output,targets)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print()
break
我看到的错误是,
torch.float32
torch.float32
Traceback (most recent call last):
File ".\main.py",line 57,in <module>
loss = loss_fn(pred_output,targets)
File "C:\Users\user\anaconda3\lib\site-packages\torch\nn\modules\module.py",line 889,in _call_impl
result = self.forward(*input,**kwargs)
File "C:\Users\user\anaconda3\lib\site-packages\torch\nn\modules\loss.py",line 1047,in forward
return F.cross_entropy(input,target,weight=self.weight,File "C:\Users\user\anaconda3\lib\site-packages\torch\nn\functional.py",line 2693,in cross_entropy
return nll_loss(log_softmax(input,1),weight,None,ignore_index,reduction)
File "C:\Users\user\anaconda3\lib\site-packages\torch\nn\functional.py",line 2388,in nll_loss
ret = torch._C._nn.nll_loss(input,_Reduction.get_enum(reduction),ignore_index)
RuntimeError: Expected object of scalar type Long but got scalar type Float for argument #2 'target' in call to _thnn_nll_loss_forward
解决方法
我可以使用此代码复制您的错误。
import torch.nn as nn
loss = nn.CrossEntropyLoss()
input = torch.randn(3,5,requires_grad=True)
target = torch.tensor([1.,2.,3.])
loss(input,target)
错误:
RuntimeError: 预期标量类型 Long 但发现 Float
将目标的数据类型更改为 target = torch.tensor([1.,3.],dtype=torch.long)
,一切正常。我相信目标变量确实需要 long 数据类型,因为将输入更改为 float 也可以。
#this will also work
input = torch.randn(3,requires_grad=True,dtype=torch.float)
target = torch.tensor([1.,dtype=torch.long)
loss(input,target)
注意文档在示例代码中也有这个 torch.long
dtype。 https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html
#编辑 1
它不起作用的原因是因为您在代码中定义输入/目标张量的方式。使用带有小“t”的 torch.tensor
而不是 torch.Tensor
。有关详细讨论,请参阅 What is the difference between torch.tensor and torch.Tensor?。
#this will work. Also notice the decimal. otherwise it will be interpreted differently by pytorch
inputs = torch.tensor([[0.,0.],[0.,1.],[1.,1.]]).to(device=device)
targets = torch.tensor([0.,1.,dtype=torch.long).to(device=device)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。