火炬:交叉熵损失中的权重

时间:2020-04-24 17:29:31

标签: python pytorch cross-entropy

我试图通过一个实际的例子来了解CrossEntropyLoss中的重量是如何工作的。因此,我首先以标准PyTorch代码运行,然后手动运行。但是损失不一样。

from torch import nn
import torch
softmax=nn.Softmax()
sc=torch.tensor([0.4,0.36])
loss = nn.CrossEntropyLoss(weight=sc)
input = torch.tensor([[3.0,4.0],[6.0,9.0]])
target = torch.tensor([1,0])
output = loss(input, target)
print(output)
>>1.7529

现在进行手动计算,首先将输入最大化:

print(softmax(input))
>>
tensor([[0.2689, 0.7311],
        [0.0474, 0.9526]])

,然后是正确的类概率的累进日志,并乘以各自的权重:

((-math.log(0.7311)*0.36) - (math.log(0.0474)*0.4))/2
>>
0.6662

我在这里缺少什么?

2 个答案:

答案 0 :(得分:1)

对于任何加权损失(reduction='mean'),该损失将通过权重之和进行归一化。因此,在这种情况下:

((-math.log(0.7311)*0.36) - (math.log(0.0474)*0.4))/(.4+.36)
>> 1.7531671457872036

答案 1 :(得分:0)

要计算您的班级的班级权重,请使用 sklearn.utils.class_weight.compute_class_weight(class_weight, *, classes, y) read it here
这将返回一个数组,即 weight

然后使用

将该权重转换为torch tensor
class_weights = torch.FloatTensor(weight)

然后将其传递给nn.CrossEntropyLoss的权重变量

criterion = nn.CrossEntropyLoss(weight=class_weights)
loss = criterion(...)