Я пытался понять, как вес в 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
Что мне здесь не хватает?