我不太理解nn.NLLLoss()。
nn.NLLLoss()
由于下面的代码总是打印,那么和使用负号(-)True之间有什么区别?nn.NLLLoss()
True
import torch while 1: b = torch.randn(1) print(torch.nn.NLLLoss()(b, torch.tensor([0])) == -b[0])
在您的情况下,每个批次元素只有一个输出值,目标是0。nn.NLLLoss损失将选择与目标张量中包含的索引相对应的预测张量的值。这是一个更一般的例子,其中您总共有五个批次元素,每个元素有三个 logit 值:
0
nn.NLLLoss
>>> 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
y_hat
>>> -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。
-y_hat