pytorch的官方文档看了好久也没看懂。。。多亏广大的网友特别鸣谢参考文献中的网友。。。。
NLLoss损失函数官方示例如下:
>>> m = nn.LogSoftmax()
>>> loss = nn.NLLLoss()
>>> # input is of size N x C = 3 x 5
>>> input = torch.randn(3, 5, requires_grad=True)
>>> # each element in target has to have 0 <= value < C
>>> target = torch.tensor([1, 0, 4])
>>> output = loss(m(input), target)
>>> output.backward()
>>>
在进行句子的关系分类时,输入n条句子,输出维度为(batch_size, C)的Tensor,其中C是分类的个数。那官方的文档来说batch_size = 3, 关系分类成5类。
解释如下:
input的输出
input经过log_softmax的输出如下,即m(input):
NLLLoss的结果就是把经过log_softmax函数的值与标签(Label)对应的那个值拿出来相加求和,再求均值,最后在求相反数,也就是添加负号。
现在Target的tensor是[1,0,4]。第一行取第1个元素,第二行取第0个,第三行取第4个,也就是上图中红框中的值,然后相加,再求个均值,最后对均值取负号。结果如下图:
代码执行的最终结果和我们手动计算的结果是相同的,可见上述的分析过程是正确的。
CrossEntropyLoss()的执行的最终结果
参考文献如下:
Pytorch详解NLLLoss和CrossEntropyLoss
版权声明:本文为zcr1024原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。