clu*_*ess 14 pytorch loss-function
我正在训练 PyTorch 模型来执行二元分类。我的少数群体约占数据的 10%,所以我想使用加权损失函数。的文档BCELoss说CrossEntropyLoss我可以为每个示例使用 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)
当然,对于您的场景,您仍然需要计算权重张量。但希望这有帮助!
您是否想对数据集中 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 杰罗恩
你需要传递如下权重:
\nCE_loss = CrossEntropyLoss(weight=[\xe2\x80\xa6])\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
24865 次 |
| 最近记录: |