我正在遵循書中的一個例子。該示例定義了 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
uj5u.com熱心網友回復:
這正是nn.NLLLoss它的作用……實際上它是它唯一的作用!它的目的是使用真實標簽索引預測張量,并回傳減去該數量。
讓y_hat是預測張量和y目標張量,然后nn.NLLLoss執行:
>>> -y_hat[torch.arange(len(y_hat)), y]
在您的示例中,歸結為-y_hat[0, 0]因為該特定實體的標簽是0.
您可以在以下位置閱讀相關帖子nn.NLLLoss:
是
nn.NLLLoss僅僅是一個正常的負面作用?對此事的認知
nn.NLLLoss
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/329959.html
