我对nn.NLLLoss()
的理解有些困难。
因为下面的代码总是输出True
,那么nn.NLLLoss()
和使用负号(-)有什么区别呢?
import torchwhile 1: b = torch.randn(1) print(torch.nn.NLLLoss()(b, torch.tensor([0])) == -b[0])
回答:
在你的例子中,每个批次元素只有一个输出值,并且目标是0
。nn.NLLLoss
损失会选择预测张量中与目标张量索引相对应的值。这里是一个更一般的例子,其中你有五个批次元素,每个元素有三个logit值:
>>> logits = torch.randn(5, 3, requires_grad=True)>>> y = torch.tensor([1, 0, 2, 0, 1])>>> y_hat = torch.softmax(b, -1)
张量y
和y_hat
分别对应目标张量和估计分布。你可以用以下方式实现nn.NLLLoss
:
>>> -y_hat[torch.arange(len(y_hat)), y]tensor([-0.2195, -0.1015, -0.3699, -0.5203, -0.1171], grad_fn=<NegBackward>)
与内置函数相比:
>>> F.nll_loss(y_hat, y, reduction='none')tensor([-0.2195, -0.1015, -0.3699, -0.5203, -0.1171], grad_fn=<NllLossBackward>)
这与单独的-y_hat
大不相同。