【问题标题】:pytorch cross-entropy-loss weights not workingpytorch 交叉熵损失权重不起作用
【发布时间】:2021-05-21 23:33:27
【问题描述】:

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

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

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

【问题讨论】:

标签: python pytorch cross-entropy


【解决方案1】:

在这个例子中,我添加了第二个具有不同目标类的数据,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)

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

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

无论如何,Pytorch 就是这样定义这个操作的。

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 2019-06-19
    • 2020-01-24
    • 2018-04-14
    • 2021-01-21
    • 2019-11-02
    • 2022-01-09
    • 2020-03-14
    • 2020-08-13
    相关资源
    最近更新 更多