Skip to main content
 首页 » 编程设计

python之PyTorch:_thnn_nll_loss_forward 未针对类型 torch.LongTensor 实现

2025年05月04日20lonelyxmas

尝试使用 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。

请您参考如下方法:

查看description F.nll_loss。它期望获得的输入不是预测的 argmax(类型 torch.long),而是完整的 64x50x43 预测向量(torch.float< 类型)/)。请注意,您提供给 F.nll_loss 的预测确实比您提供的基本事实目标多了一个维度。

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

loss = F.nll_loss(output, targets)