Pytorch: вес при перекрестной потере энтропии - PullRequest
0 голосов
/ 24 апреля 2020

Я пытался понять, как вес в 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

Теперь для ручного расчета сначала softmax вводим:

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

Что мне здесь не хватает?

1 Ответ

1 голос
/ 24 апреля 2020

Для любой взвешенной потери (reduction='mean') потеря будет нормализована на сумму весов. Так что в этом случае:

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