Pytorch:交叉熵损失中的权重

use*_*813 16 python cross-entropy pytorch

我试图通过一个实际的例子来理解 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
Run Code Online (Sandbox Code Playgroud)

现在进行手动计算,首先对输入进行 softmax:

print(softmax(input))
>>
tensor([[0.2689, 0.7311],
        [0.0474, 0.9526]])
Run Code Online (Sandbox Code Playgroud)

然后正确类别概率的负对数并乘以各自的权重:

((-math.log(0.7311)*0.36) - (math.log(0.0474)*0.4))/2
>>
0.6662
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?

Pra*_*kar 16

要计算班级的班级权重,请sklearn.utils.class_weight.compute_class_weight(class_weight, *, classes, y) 在此处阅读,
这将返回一个数组,即 weight
例如。

x = torch.randn(20, 5) 
y = torch.randint(0, 5, (20,)) # classes
class_weights=class_weight.compute_class_weight('balanced',np.unique(y),y.numpy())
class_weights=torch.tensor(class_weights,dtype=torch.float)
 
print(class_weights) #([1.0000, 1.0000, 4.0000, 1.0000, 0.5714])
Run Code Online (Sandbox Code Playgroud)

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

criterion = nn.CrossEntropyLoss(weight=class_weights,reduction='mean')

loss = criterion(...)
Run Code Online (Sandbox Code Playgroud)

  • 你不应该传递`1/class_weights`吗?毕竟你想增加少数群体的权重。 (2认同)

use*_*813 6

对于任何加权损失(reduction='mean'),损失将通过权重之和进行标准化。所以在这种情况下:

((-math.log(0.7311)*0.36) - (math.log(0.0474)*0.4))/(.4+.36)
>> 1.7531671457872036
Run Code Online (Sandbox Code Playgroud)