了解此示例中 nn.NLLLoss 函数的参数

Understanding parameters of nn.NLLLoss function in this example

我正在学习书中的一个例子。该示例定义了 nn.NLLLoss() 函数,其输入让我感到困惑。

我的模型的最后一步是 nn.LogSoftmax,它给了我下面的张量输出(我在单个图像上尝试这个例子):

tensor([[-0.7909, -0.6041]], grad_fn=<LogSoftmaxBackward>) 

张量具有图像是鸟还是飞机的概率。该示例为鸟定义 0,为飞机定义 1。

现在,在定义损失函数时,该示例同样将上述张量和图像的正确标签作为输入传递:

loss = nn.NLLLoss()
loss( out,  torch.tensor([0])) #0 as the image is of a bird

我无法理解为什么我们要传递图像的标签。我的猜测是标签指定模型在计算损失时要考虑的概率指数。但是,如果是这种情况,为什么我们需要将标签作为张量传递,我们可以将标签作为索引传递给 out 张量,同样:

loss( out[0, 0] ) # [0, 0] since out is a 2d Tensor

这正是 nn.NLLLoss 所做的...实际上它是 唯一 所做的事情!其目的是使用真实标签对预测张量进行索引,然后 return 减去该数量。

y_hat为预测张量,y为目标张量,则nn.NLLLoss执行:

>>> -y_hat[torch.arange(len(y_hat)), y]

在您的示例中,它归结为 -y_hat[0, 0],因为该特定实例的标签是 0


您可以阅读 nn.NLLLoss 上的相关帖子:

  • Is nn.NLLLoss is just a normal negative function?