0

我一直在尝试使用 CNN 对 VOC2007 数据集进行分类。数据集存在不平衡,多个图像具有“人”类,而所有其他类的图像很少,我的模型一直受到过度拟合的影响。为了过度采样,我一直在我的数据加载器中使用 WeightedRandomSampler。

weights=[0.00000001,1/112,1/116,1/180,1/81,1/139,1/97,1/376,1/163,1/224,1/69,1/97,1/203,1/139,1/120,0.00001,1/133,1/48,1/111,1/127,1/128]

sample_weights=[0]*len(ds_train)

for idx, (data, label) in enumerate(ds_train):
 
  sample_weights[idx]=np.dot(weights, label)
 

sampler=WeightedRandomSampler(sample_weights,num_samples=len(sample_weights), replacement=True)

这并没有给我一个平衡的数据集。我确定我的代码有问题,这不是必须为 coco 数据集创建权重的方式。但我不确定应该怎么做。应该如何为以 logits 作为标签的数据集创建权重。如何对具有 20 个类的 coco 图像数据集执行过采样?任何帮助将非常感激。

4

1 回答 1

0

您需要根据类别为数据集的每个实例分配正确的类别权重。解决这个问题的直接方法是使用标签的数据集列表索引一个类权重数组:

>>> weights= np.array([0.00000001, 1/112, 1/116, 1/180, 1/81, 1/139, 1/97, 1/376, \ 
                       1/163, 1/224, 1/69, 1/97, 1/203, 1/139, 1/120, 0.00001, \
                       1/133,1/48,1/111,1/127,1/128])

>>> sample_weights = weights[[label for _, label in ds_train]] 

然后你可以构建采样器:

>>> sampler = WeightedRandomSampler(sample_weights, 
                                    num_samples=len(sample_weights), 
                                    replacement=True)
于 2021-10-04T20:04:49.743 回答