当尝试使用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
。
答案 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
。
如果是这样,我相信您对使用50
或argmax()
感到有些困惑。正如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
。