【问题标题】:Intution behind weighted random sampler in PyTorchPyTorch 中加权随机采样器背后的直觉
【发布时间】:2021-09-24 17:00:12
【问题描述】:

我正在尝试使用WeightedRandomSampler 处理数据集中的不平衡(class1:2555,class 2:227,class 3:621,class 4:2552 图像)。但是,我调试了这些步骤,但它背后的直觉对我来说并不清楚。我的目标标签采用 one-hot 编码向量的形式,如下所示。

train_labels.head(5)

我将标签转换为类索引:

labels = np.argmax(train_labels.loc[:, 'none':'both'].values, axis=1)
train_labels = torch.from_numpy(labels)
train_labels
tensor([0, 0, 1,  ..., 1, 0, 0])

以下是我用来计算加权随机采样器的步骤。如果我对任何步骤的解释有误,请纠正我。

  1. 统计数据集中每个类的样本数

    class_sample_count = np.array(train_labels.value_counts()) 
    class_sample_count
    array([2555, 2552,  621,  227])
    
  2. 计算每个类的权重

    weight = 1. / class_sample_count 
    weight
    array([0.00039139, 0.00039185, 0.00161031, 0.00440529])
    
  3. 计算数据集中每个样本的权重。

    samples_weight = np.array(weight[train_labels])
    print(samples_weight[1], samples_weight[2] )
    0.0003913894324853229 0.00039184952978056425 
    

将 np.array 转换为张量

     tensor([0.0004, 0.0004, 0.0004,  ..., 0.0004, 0.0004, 0.0004],
     dtype=torch.float64)

转换为张量后,所有样本在所有四个条目中似乎都具有相同的值?那么加权随机抽样是如何帮助处理不平衡数据集的呢?

我将不胜感激。谢谢。

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    这是因为您正在计算 one-hot 编码的权重,并且由于有四个组件(四个类),因此在索引 weight[train_labels] 之后每个实例最终有四个相同的权重。您拥有相同的权重这一事实非常好,因为每个实例都应该被分配一个唯一的权重。对于采样器来说,这个权重对应于选择这个实例的概率。如果给定类在数据集中突出,则相关频率(权重)将很低,因此该类的实例从数据集中被采样的概率较低。 p>

    对于相当多的样本,这种加权方案的目标是在类表示不平衡的情况下实现平衡采样。

    如果你坚持使用 one-hot 编码,你可以选择第一列:

    >>> sample_weights = np.array(weight[train_labels])[:,0]
    

    然后使用WeightedRandomSampler构造一个采样器:

    >>> sampler = WeightedRandomSampler(sample_weights, len(train_labels))
    

    最后你可以将它插入数据加载器:

    >>> DataLoader(dataset, batch_size, sampler=sampler)
    

    【讨论】:

    • 我将 one-hot 编码转换为类索引。但是,对于每个标签,我仍然得到相同的单个值 0.004。这意味着无论类别中图像的频率如何,权重都是相同的。这个权重如何过采样少数类?每个类别的图像数量仍然相同。所有类的相同概率如何帮助不平衡的数据集?由于底层没有。多数类别的图像数量越来越少。
    • 您能否通过编辑上面的问题来显示您应用的将 ohe 转换为类索引的修改
    • 我已经编辑了主帖。现在的类标签是:0,1,2,3
    • 您只打印第一个和最后三个具有标签0 或标签1 的实例,它们都具有相似的权重。我建议你看看其他一些实例,或者试试这个以获得更好的视图:torch.unique(samples_weight),你会看到;)
    • 这是我使用 torch.unique(samples_weight) 得到的张量:张量([0.0004, 0.0004, 0.0016, 0.0044], dtype=torch.float64)。每个值都是唯一的:)。现在直觉:采样器在批次中选择权重较高的标签比权重较低的样本更频繁?因此,总体而言,在一个批次中,抽样是平衡的。
    猜你喜欢
    • 1970-01-01
    • 2020-06-04
    • 2021-08-20
    • 2020-10-03
    • 2018-10-11
    • 2018-02-02
    • 2020-09-07
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多