【问题标题】:Understanding parameters of nn.NLLLoss function in this example在这个例子中理解 nn.NLLLoss 函数的参数
【发布时间】:2021-12-07 16:57:28
【问题描述】:

我正在关注书中的一个例子。该示例定义了 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

【问题讨论】:

    标签: python machine-learning pytorch


    【解决方案1】:

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

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

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

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


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

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 2020-05-24
      • 2019-08-11
      • 1970-01-01
      相关资源
      最近更新 更多