我观察到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的源代码.
1条答案
按热度按时间lymgl2op1#
BCELoss类前向方法基于F.binary_cross_entropy link,所以它返回相同的结果,因为它是相同的。在大多数情况下,我们初始化类并传递模型输出。
然而,可能有一些用例需要使用函数来代替。
nn.BCEWithLogitsLoss包含了sigmoid激活,所以你不需要显式地添加它,就像只使用BCE所示的那样: