PyTorch:没有为类型为torch.LongTensor实现_thnn_nll_loss_forward

问题描述 投票:1回答:2

当尝试使用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),两者的dtypes为torch.int64

python machine-learning computer-vision pytorch loss-function
2个回答
3
投票

看看descriptionF.nll_loss。它期望输入不是预测的argmax(类型torch.long),而是完整的64x50x43预测向量(类型为torch.float)。请注意,您提供给F.nll_loss的预测确实比您提供的基本事实目标更具有额外的维度。

在您的情况下,只需删除argmax:

loss = F.nll_loss(output, targets)

2
投票

看起来你正在使用43类处理分类任务,使用64的批量大小和“序列长度”是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代替。

© www.soinside.com 2019 - 2024. All rights reserved.