pytorch 交叉熵损失权重不起作用

pytorch cross-entropy-loss weights not working

我正在尝试一些代码,它的行为与我预期的不同。所以我把它简化为一个最低限度的工作示例:

import torch

test_act = torch.tensor([[2.,0.]])
test_target = torch.tensor([0])

loss_function_test = torch.nn.CrossEntropyLoss()
loss_test = loss_function_test(test_act, test_target)
print(loss_test)
> tensor(0.1269)

weights=torch.tensor([0.1,0.5])
loss_function_test = torch.nn.CrossEntropyLoss(weight=weights)
loss_test = loss_function_test(test_act, test_target)
print(loss_test)
> tensor(0.1269)

如您所见,无论是否存在权重,输出都是相同的。但我希望第二个输出是 0.0127

是否正在进行一些我不知道的正常化?还是它可能被窃听了?

在这个例子中,我添加了第二个具有不同目标的数据class,weights的效果是可见的。

import torch

test_act = torch.tensor([[2.,1.],[1.,4.]])
test_target = torch.tensor([0,1])

loss_function_test = torch.nn.CrossEntropyLoss()
loss_test = loss_function_test(test_act, test_target)
print(loss_test)
>>> tensor(0.1809)


weights=torch.tensor([0.1,0.5])
loss_function_test = torch.nn.CrossEntropyLoss(weight=weights)
loss_test = loss_function_test(test_act, test_target)
print(loss_test)
>>> tensor(0.0927)

这种效果是因为“损失是对每个小批量的观察结果进行平均的。如果指定了权重参数,那么这是一个加权平均值”,但仅限于小批量。

我个人觉得这有点奇怪,并且认为全局应用权重会很有用(即,即使所有 classes 都不存在于每个小批量中)。权重参数的显着用途之一表面上是为数据集中代表性不足的 classes 赋予更多权重,但通过这种表述,少数 classes 仅被赋予更高的权重它们存在的小批量(当然,这是一个很低的百分比,因为它们是少数class)。

无论如何,这就是 Pytorch 定义此操作的方式。