PyTorch:_thnn_nll_loss_forward未针对手电筒类型实现。

时间:2019-04-30 04:52:22

标签: python machine-learning computer-vision pytorch loss-function

当尝试使用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),并且dtype均为torch.int64

2 个答案:

答案 0 :(得分:3)

查看F.nll_loss中的description。它期望获得的输入不是预测的argmax(类型torch.long),而是完整的64x50x43预测矢量(类型torch.float)作为输入。请注意,实际上,您提供给F.nll_loss的预测比您提供的基本事实目标具有更多的维度。

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

loss = F.nll_loss(output, targets)

答案 1 :(得分:2)

似乎您正在处理if let httpResponse = response as? HTTPURLResponse { print("error \(httpResponse.statusCode)") if httpResponse.statusCode == 200{ //Success }else{ //Failed } }else { //Failed } 类的分类任务,使用43的批处理大小为“ {sequence length”为64

如果是这样,我相信您对使用50argmax()感到有些困惑。正如Shai给出的参考一样,假设F.log_softmax是logit值,则可以使用:

output

这是使用output_x = F.log_softmax(output, dim=2) loss = F.nll_loss(output_x, targets) 的正确方法,或者如果您不想使用nll_loss 您自己可以使用log_softmax