NLLLoss
首先,简单地谈下我对NLLLoss损失函数的理解。
经过上面的计算我们知道, 计算出来的值范围在 ,值的含义表示对应类别的概率。也就是说,每行中最接近于 的值对应的类别,就是该图片所属概率最大的类别。这时,目标是最大化概率。但在机器学习中,通常最小化某个函数值,因此,对概率值再进行一次 变换。经过 变换之后,最大概率值即为最接近于 的值。其它概率值经 变换之后,均为小于 的实值。为了满足最小化的条件, 函数通常会取个负号( )。此时,若实际标签张量在模型输出结果 的对应位置的值越接近0,则具有越小的损失值;否则,损失值越大。
举例: 假设实际标签张量为 (pig, pig, cat, dog),而模型输出结果为 。因此,直接使用NLLLoss损失函数计算预测结果和Real Label之间的损失值如下所示。
>>>logsfm(output)
tensor([[-0.9718, -1.4177, -0.9694],
[-1.1788, -1.0826, -1.0395],
[-0.8300, -1.1571, -1.3881],
[-1.0693, -1.3454, -0.9255]])
>>> loss = nn.NLLLoss()
>>> target = torch.tensor([2, 2, 0, 1])
>>> loss(logsfm(output), target)
tensor(1.0461)
Of course, 实际标签张量为 ,因此我们可以手动计算NLLLoss损失函数对应的损失值。显然,两者的计算结果是一致的。
>>> loss = logsfm(output)[0, 2] + logsfm(output)[1, 2] + logsfm(output)[2, 0] + logsfm(output)[3, 1]
>>> loss
tensor(-4.1843)
>>> -loss / logsfm(output).size()[0]
tensor(1.0461)