在 CrossEntropyLoss 和 BCELoss (PyTorch) 中使用权重

clu*_*ess 14 pytorch loss-function

我正在训练 PyTorch 模型来执行二元分类。我的少数群体约占数据的 10%,所以我想使用加权损失函数。的文档BCELossCrossEntropyLoss我可以为每个示例使用 a 'weight'

但是,当我声明CE_loss = nn.BCELoss()ornn.CrossEntropyLoss()然后 do CE_Loss(output, target, weight=batch_weights), where output, target, and batch_weightsare Tensors of 时batch_size,我收到以下错误消息:

forward() got an unexpected keyword argument 'weight'
Run Code Online (Sandbox Code Playgroud)

小智 11

实现目标的另一种方法是reduction=none在初始化损失时使用,然后在计算平均值之前将结果张量乘以权重。例如

loss = torch.nn.BCELoss(reduction='none')
model = torch.sigmoid

weights = torch.rand(10,1)
inputs = torch.rand(10,1)
targets = torch.rand(10,1)

intermediate_losses = loss(model(inputs), targets)
final_loss = torch.mean(weights*intermediate_losses)
Run Code Online (Sandbox Code Playgroud)

当然,对于您的场景,您仍然需要计算权重张量。但希望这有帮助!


Jer*_*ens 5

您是否想对数据集中 0 类和 1 类的所有元素应用单独的固定权重?目前尚不清楚您在这里为batch_weights传递什么值。如果是这样,那么这不是 BCELoss 中的权重参数的作用。权重参数期望您为数据集中的每个元素(而不是每个类)传递单独的权重。有几种方法可以解决这个问题。您可以为每个元素构建一个权重表。或者,您可以使用自定义损失函数来执行您想要的操作:

def BCELoss_class_weighted(weights):

    def loss(input, target):
        input = torch.clamp(input,min=1e-7,max=1-1e-7)
        bce = - weights[1] * target * torch.log(input) - (1 - target) * weights[0] * torch.log(1 - input)
        return torch.mean(bce)

  return loss
Run Code Online (Sandbox Code Playgroud)

请注意,添加钳位以避免数值不稳定非常重要。

HTH 杰罗恩


Sud*_*shu 0

你需要传递如下权重:

\n
CE_loss = CrossEntropyLoss(weight=[\xe2\x80\xa6])\n
Run Code Online (Sandbox Code Playgroud)\n