pytorch BCELOSS与二进制交叉熵:权重使用不同

xe55xuns  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(189)

我观察到BCELoss中的权重确实对批处理中的每个样本进行了加权,但binary_cross_entropy中的权重根据0还是1来对损失进行加权。这非常奇怪,因为binary_cross_entropy docs of binary_cross_entropy的文档有一个指向the docs of BCELoss的重定向链接。
这是一个简短的示例,仅在binary_cross_entropy中,如果1或0是具有对应的相同预测的真实标签,则损失受到影响:

import torch
import torch.nn.functional as F
from torch.nn import BCELoss

predictions1 = torch.tensor([[0.2,0.8]],dtype=torch.float)
predictions2 = torch.tensor([[0.8,0.2]],dtype=torch.float)
true_val1 = torch.tensor([[0,1]],dtype=torch.float)
true_val2 = torch.tensor([[1,0]],dtype=torch.float)
weights = torch.tensor([[0.6,5]],dtype=torch.float)

bce_loss = BCELoss(weight=weights)
bce_loss(predictions1, true_val1)
>>> out: tensor(0.6248)
bce_loss(predictions2, true_val2)
>>> out: tensor(0.6248)
F.binary_cross_entropy(input=predictions1, target=true_val1, weight=weights)
>>> out: tensor(0.6248)
F.binary_cross_entropy_with_logits(input=predictions2, target=true_val2, weight=weights)
>>> out: tensor(2.1067)

我是不是看不出这有什么意义?为什么在pytorch中甚至有两种计算二进制交叉熵损失的方法?
没什么,我没查pytorch的源代码.

lymgl2op

lymgl2op1#

BCELoss类前向方法基于F.binary_cross_entropy link,所以它返回相同的结果,因为它是相同的。在大多数情况下,我们初始化类并传递模型输出。

class BCELoss(_WeightedLoss):
      def __init__(self, weight: Optional[Tensor] = None, size_average=None, reduce=None, reduction: str = 'mean') -> None:
          super(BCELoss, self).__init__(weight, size_average, reduce, reduction)

      def forward(self, input: Tensor, target: Tensor) -> Tensor:
          return F.binary_cross_entropy(input, target, weight=self.weight, reduction=self.reduction)

然而,可能有一些用例需要使用函数来代替。
nn.BCEWithLogitsLoss包含了sigmoid激活,所以你不需要显式地添加它,就像只使用BCE所示的那样:

loss = F.binary_cross_entropy(torch.sigmoid(input), target)

相关问题