PyTorch:_thnn_nll_loss_forward 未针对类型 torch.LongTensor 实现
PyTorch: _thnn_nll_loss_forward is not implemented for type torch.LongTensor
尝试使用 PyTorch 创建模型时,当我尝试实现损失函数时 nll_loss
,它抛出以下错误
RuntimeError: _thnn_nll_loss_forward is not implemented for type torch.LongTensor
我创建的拟合函数是:
for epoch in tqdm_notebook(range(1, epochs+1)):
for batch_idx, (data, targets) in enumerate(train_loader):
optimizer.zero_grad()
net.float()
output = net(data)
output_x = output.argmax(dim=2) #to convert (64,50,43) -> (64, 50)
loss = F.nll_loss(output_x, targets)
loss.backward()
optimizer.step()
if batch_idx % 100 == 0:
print('Train epochs: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx*len(data), len(ds.data),
100.*batch_idx / len(ds), loss.item()
))
其中输出和目标的形状是 (64, 50) 并且两者的数据类型都是 torch.int64
。
看看F.nll_loss
的description。它期望获得的输入不是预测的 argmax
(类型 torch.long
),而是完整的 64x50x43 预测向量(类型 torch.float
)。请注意,您提供给 F.nll_loss
的预测确实比您提供的地面实况目标多了一个维度。
对于您的情况,只需删除 argmax:
loss = F.nll_loss(output, targets)
看起来您正在使用 43
类 处理分类任务,使用 64
和 "sequence length" 的批量大小是 50
.
如果是这样,我相信您对使用 argmax()
或 F.log_softmax
有点困惑。正如 Shai 给出的参考,给定 output
是 logit 值,您可以使用:
output_x = F.log_softmax(output, dim=2)
loss = F.nll_loss(output_x, targets)
这是正确的使用方法nll_loss
,或者如果你不想这样做log_softmax
你自己,你可以使用 nn.CrossEntropyLoss
代替。
尝试使用 PyTorch 创建模型时,当我尝试实现损失函数时 nll_loss
,它抛出以下错误
RuntimeError: _thnn_nll_loss_forward is not implemented for type torch.LongTensor
我创建的拟合函数是:
for epoch in tqdm_notebook(range(1, epochs+1)):
for batch_idx, (data, targets) in enumerate(train_loader):
optimizer.zero_grad()
net.float()
output = net(data)
output_x = output.argmax(dim=2) #to convert (64,50,43) -> (64, 50)
loss = F.nll_loss(output_x, targets)
loss.backward()
optimizer.step()
if batch_idx % 100 == 0:
print('Train epochs: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx*len(data), len(ds.data),
100.*batch_idx / len(ds), loss.item()
))
其中输出和目标的形状是 (64, 50) 并且两者的数据类型都是 torch.int64
。
看看F.nll_loss
的description。它期望获得的输入不是预测的 argmax
(类型 torch.long
),而是完整的 64x50x43 预测向量(类型 torch.float
)。请注意,您提供给 F.nll_loss
的预测确实比您提供的地面实况目标多了一个维度。
对于您的情况,只需删除 argmax:
loss = F.nll_loss(output, targets)
看起来您正在使用 43
类 处理分类任务,使用 64
和 "sequence length" 的批量大小是 50
.
如果是这样,我相信您对使用 argmax()
或 F.log_softmax
有点困惑。正如 Shai 给出的参考,给定 output
是 logit 值,您可以使用:
output_x = F.log_softmax(output, dim=2)
loss = F.nll_loss(output_x, targets)
这是正确的使用方法nll_loss
,或者如果你不想这样做log_softmax
你自己,你可以使用 nn.CrossEntropyLoss
代替。