BCEWithLogitsLoss
- classtorch.nn.BCEWithLogitsLoss(weight=None, size_average=None, reduce=None, reduction='mean', pos_weight=None)[源代码]
-
此损失函数结合了一个Sigmoid层和一个BCELoss层于一体。相比先使用简单的Sigmoid层再接BCELoss层,这种版本在数值稳定性方面更优。通过将操作合并到一层中,我们利用了log-sum-exp技巧来提高数值稳定性。
当
reduction
设置为'none'
时,损失可以描述为未减少的:其中 表示批量大小。如果
reduction
不是'none'
(默认为'mean'
),则这用于测量如自编码器中的重构误差。请注意,目标t[i]应为0到1之间的数值。
可以通过为正例分配权重来平衡召回率和精确率。在多标签分类的情况下,损失函数可以表示为:
其中表示类别编号(对于多标签二分类问题,;对于单标签二分类问题,),表示批次中的样本数量,而是类别的正例权重。
当时提高召回率,当时提高精确度。
例如,如果一个数据集包含单个类别的100个正样本和300个负样本,则该类的
pos_weight
应设置为。损失函数会将数据集中的正样本数量视为个进行计算。示例:
>>> target = torch.ones([10, 64], dtype=torch.float32) # 64 classes, batch size = 10 >>> output = torch.full([10, 64], 1.5) # A prediction (logit) >>> pos_weight = torch.ones([64]) # All weights are equal to 1 >>> criterion = torch.nn.BCEWithLogitsLoss(pos_weight=pos_weight) >>> criterion(output, target) # -log(sigmoid(1.5)) tensor(0.20...)
在上述示例中,
pos_weight
张量的元素对应于多标签二元分类场景中的 64 个不同类别。每个pos_weight
元素旨在根据各自类别的正负样本不平衡情况调整损失函数。这种方法在具有不同程度类别不平衡的数据集中非常有用,确保损失计算准确地反映每个类别的分布。- 参数
-
-
weight (Tensor, 可选) – 每个批次元素损失的手动重缩放权重。如果提供,必须是一个大小为 nbatch 的 Tensor。
-
size_average (bool, optional) – 已弃用(请参见
reduction
)。默认情况下,损失值会在批次中的每个损失元素上进行平均计算。需要注意的是,对于某些损失函数,每个样本包含多个损失元素。如果将字段size_average
设置为False
,则损失值会针对每个小批量求和。当reduce
为False
时,此设置会被忽略。默认值:True
-
reduce (bool, optional) – 已弃用(请参见
reduction
)。默认情况下,损失值会根据size_average
参数在每个小批量中进行平均或求和。当reduce
为False
时,返回每批元素的单独损失值,并忽略size_average
设置。默认值:True
-
reduction (str, 可选) – 指定要应用于输出的缩减方式:
'none'
|'mean'
|'sum'
。'none'
: 不进行任何缩减,'mean'
: 输出总和除以元素数量,'sum'
: 对输出求和。注意:size_average
和reduce
正在被弃用,在此期间,指定这两个参数中的任何一个将覆盖reduction
参数。默认值:'mean'
-
pos_weight (Tensor, optional) – 正例的权重,与目标进行广播。必须是一个张量,在类别维度上的大小要和类的数量相等。请注意 PyTorch 的广播语义以实现所需的运算。对于一个大小为 [B, C, H, W](其中 B 是批量大小)的目标,
pos_weight
大小为 [B, C, H, W] 将对每个批次中的元素应用不同的正权重;或者[C, H, W]
对整个批次使用相同的正权重。对于一个 2D 多类目标 [C, H, W],若要在所有空间维度上应用相同的正权重,请使用:[C, 1, 1]。默认值:None
-
- 形状:
-
-
输入: ,其中表示任意维度的数量。
-
目标: ,形状与输入相同。
-
输出:标量。如果
reduction
是'none'
,那么结果为 ,其形状与输入相同。
示例:
>>> loss = nn.BCEWithLogitsLoss() >>> input = torch.randn(3, requires_grad=True) >>> target = torch.empty(3).random_(2) >>> output = loss(input, target) >>> output.backward()
-