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

Eum*_*mel 1 python cross-entropy pytorch

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

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)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,无论是否存在权重,输出都是相同的。但我预计第二个输出是 0.0127

是否有一些我不知道的正常化正在发生?或者它可能被窃听了吗?

Der*_*ekG 6

在此示例中,我添加了具有不同目标类的第二个数据,效果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)
Run Code Online (Sandbox Code Playgroud)

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

就我个人而言,我觉得这有点奇怪,并且认为全局应用权重会很有用(即即使每个小批量中不存在所有类)。权重参数的突出用途之一表面上是为数据集中代表性不足的类赋予更多权重,但通过这种表述,少数类仅在它们所在的小批量中被赋予更高的权重(其中,当然,比例很低,因为他们是少数群体)。

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