首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >binary_cross_entropy_with_logits:体重和pos_weight的区别是什么?

binary_cross_entropy_with_logits:体重和pos_weight的区别是什么?
EN

Stack Overflow用户
提问于 2022-03-31 09:38:00
回答 1查看 725关注 0票数 0

根据Pytorch关于逻辑的文档,它们被描述为:

重量

重量(张量,可选)-手动重标度,如果它是重复的,以匹配输入张量形状

pos_weight

pos_weight (张量,可选)-一个正面例子的权重。必须是长度等于类数的向量。

他们有什么不同?这个解释相当含糊。如果我正确理解,权重是每个像素(类)的单个权重,那么pos_weight在哪里是所有非背景(负像素/零)的权重?

如果我同时设置了这两个参数呢?例如:

代码语言:javascript
运行
复制
import torch 

preds = torch.randn(4, 100, 50, 50)
target = torch.zeros((4, 100, 50, 50))
target[:, :, 10:20, 10:20] = 1

pos_weight = target * 100
pos_weight[pos_weight < 100] = 1
weight = target * 100
weight[weight < 100] = 1

loss1 = binary_cross_entropy_with_logits(preds, target, pos_weight=pos_weight, weight=weight)
loss2 = binary_cross_entropy_with_logits(preds, target, pos_weight=pos_weight)
loss3 = binary_cross_entropy_with_logits(preds, target, weight=weight)

loss1loss2loss3,哪个是正确的用法?

关于同样的问题,我读了一篇论文,上面写着:

为了处理不平衡的负和正数据,我们将每个关键点扩展10个像素,并使用加权交叉熵损失。每个keypoint的权重设置为100,而对于非keypoint像素,则设置为1。

根据报纸,正确的用法是哪一种?

谢谢您的任何解释!

EN

回答 1

Stack Overflow用户

发布于 2022-03-31 10:13:22

pos_weight参数允许您平衡正示例,从而控制召回和精度(另请参阅)之间的权衡。在这个线程上可以找到一个详细的解释以及显式的数学表达式。另一方面,weight允许对给定批处理上的不同元素进行权衡。

下面是一个很小的例子:

代码语言:javascript
运行
复制
>>> target = torch.ones([10, 64], dtype=torch.float32)
>>> output = torch.full([10, 64], 1.5)

>>> criterion = torch.nn.BCEWithLogitsLoss() # w/o weight
>>> criterion(output, target)
tensor(0.2014) # all batch elements weighted equally

>>> weight = torch.rand(10,1)
>>> criterion = torch.nn.BCEWithLogitsLoss(weight=weight) # w/ weight
>>> criterion(output, target)
tensor(0.0908) # per element weighting

与所做的相同:

代码语言:javascript
运行
复制
>>> criterion = torch.nn.BCEWithLogitsLoss(reduction='none')
>>> torch.mean(criterion(output, target)*weight)
tensor(0.0908)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71690251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档