我在玩一些代码,它的行为与我预期的不一样。所以我把它简化为一个最简单的例子:
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
有什么我不知道的正常化吗?或者它可能被窃听了?
发布于 2021-05-21 15:33:27
在本例中,我使用不同的目标类添加了第二个数据管理,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)这种影响是因为“每个小批的损失都是通过观察来平均的。如果指定了权重参数,那么这是一个加权平均值”,但只有在小批中。
就我个人而言,我觉得这有点奇怪,我认为在全球范围内应用权重是有用的(也就是说,即使每个小批中没有所有的类)。加权参数的一个显著用途表面上是给数据集中表示不足的类赋予更多的权重,但通过这种公式,少数类只在它们存在的小型批次中获得更高的权重(当然,这是一个很低的百分比,因为它们是少数类)。
在任何情况下,这就是毕道尔定义此操作的方式。
https://stackoverflow.com/questions/67639540
复制相似问题