了解此示例中 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?
我正在学习书中的一个例子。该示例定义了 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?