首页 > 解决方案 > 在 PyTorch DataLoader 中对批次进行强制定量

问题描述

我遇到了一个数据严重不平衡的二元分类任务。(我看的是80:1)
通过欠采样,数据比现在是20:1。\

现在,欠采样/处理的数据被加载到数据加载器中,如下所示。(这是一个 nlp 任务)

train_inputs = torch.tensor(input_ids)
train_labels = torch.tensor(labels)
train_masks = torch.tensor(attention_masks)

train_data = TensorDataset(train_inputs, train_masks, train_labels)
if is_distributed:
    train_sampler = torch.utils.data.distributed.DistributedSampler(dataset)
else:
    train_sampler = RandomSampler(train_data)
train_dataloader = DataLoader(train_data, sampler=train_sampler, batch_size=batch_size)

对于每个批次,我想确保/强制每个批次在每个分类方面的比例为 20:1。是否有一个 pytorch 内置方法可以让我强制执行这些条件?

标签: machine-learningdeep-learningpytorch

解决方案


您可以使用WeightedRandomSampler并将替换设置为 true。只需将正例的权重乘以 20 即可使比率偏向 20:1。(假设正面是负面的 20 倍)

# labels is a numpy array of shape n,1 containing 1 and 0 for each datapoint
weights = np.ones(labels.shape)
weights[labels==1] *= 20
# now the samples will be drawn with a 20:1 ratio
sampler = WeightedRandomSampler(weights=weights, num_samples=len(labels), replacement=True)

请注意,将替换设置为 True 是强制使用比率对每个批次进行采样的必要条件,但您可能会在训练期间看到两次示例。但是,如果该比率在您的数据集中自然发生,您可以将其保留为 False。

恕我直言:随机抽样不能确保每个批次的比率为 20:1,而仅适用于比率的预期值(平均而言,批次(样本)的比率将倾向于数据集(总体)的比率),因此它应该在训练期间也不会影响平均梯度(理论上)。但我知道在实践中您可能希望拥有更多控制权。


推荐阅读