【问题标题】:Understanding pos_weight argument in BCEWithLogitsLoss理解 BCEWithLogitsLoss 中的 pos_weight 参数
【发布时间】:2021-06-14 00:56:53
【问题描述】:

我试图了解pos_weight 参数是如何在BCEWithLogitsLoss 中使用的,以便能够正确定义pos_weight 张量。文档只提到:“正例的权重。必须是长度等于类数的向量。”。由于我无法通过查看代码获得足够的理解(实际代码隐藏在多个函数加载器后面,我什至没有达到使用pos_weight 的地步),我有几个关于pos_weight 论据:

  1. 负样本的权重是否始终为 1?
  2. 如果负样本的权重始终为 1,并且假设我希望每个样本对损失的贡献相同,我会执行以下操作。设l = [100, 10, 5, 15] 其中l[0] 是负样本的数量,l[1:] 是每个标签的正样本数量。在伪代码中是这样的:
l = [100, 10, 5, 15]
lcm = LCM(l)  # 300
weights = lcm / l  # weights = [3, 30, 60, 20]
weights = weights / l[0]  # weights = [1, 10, 20, 6.6667]
positive_weights = weights[1:]  # [10, 20, 6.66667]
criterion = nn.BCEWithLogitsLoss(pos_weight=positive_weights)

有人可以确认我对如何使用pos_weight 的理解是否正确?

【问题讨论】:

    标签: pytorch


    【解决方案1】:

    我没有设法找到明确的答案,但从我的实验看来我是对的,即负样本权重被认为是 1,而将正样本的权重增加到 1 会使它们更重要。此外,用于计算权重的 LCM 方法实际上既不好也不需要。首先它很糟糕,因为如果您有很多具有不同样本数量的类,则 LCM 可能是一个非常大的数字,因此通常精确计算它甚至是不可行的。此外,它不是必需的,因为您只需将每个标签的负样本数量除以正样本数量并以这种方式获得权重即可获得相同的权重。这是一个简短的代码 sn-p,如果您在 pandas DataFrame 中有数据,如何获得权重。以这种方式获得权重会产生一个“平衡”的数据集,理想情况下您可以在其中优化精度和召回率。

    def get_train_dataset_pos_weights(self):
        """Returns weights for positive samples used for unbalanced datasets."""
    
        num_pos_samples = self.train_df[self.label_columns].sum().sum()
        num_neg_samples = len(self.train_df) - num_pos_samples
        assert len(self.train_df) == (num_neg_samples + num_pos_samples)
        num_pos_samples_per_label = np.array(
            list(self.train_df[self.label_columns].sum()))
        weights = num_neg_samples / num_pos_samples_per_label
    
        return torch.from_numpy(weights)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-05
      • 2022-01-07
      • 2021-10-07
      • 2013-07-10
      • 1970-01-01
      • 2020-04-27
      • 2019-05-07
      • 1970-01-01
      相关资源
      最近更新 更多