解决样本不平衡问题

参考:https://www.zhihu.com/question/56662976
三个维度考虑

一.数据方面

1.1、修改数据采样比例
训练过程中调节采样比例,具体方法参考:https://blog.csdn.net/ittongyuan/article/details/131088803
关键代码:

from torch.utils.data import DataLoader
from torch.utils.data.sampler import WeightedRandomSampler

# 自定义的dataset,前10000个是dog,然后是1000个cat,共11000个数据。
train_dataset   = DataGenerator(train_imgs, input_shape=input_shape, train=True)
# 每个类别的样本数量
num_dog   	    = 10000
num_cat         = 1000
# weight列表
train_weights   = []
train_weights.extend([1/num_dog]*num_dog) # 扩展10000个0.0001,前10000个样本的采样权重,狗多权重小
train_weights.extend([1/num_cat]*num_cat)  # 扩展1000个0.001,后1000个样本的采样权重,猫少权重大
print(train_weights) # 可以打印看看,总共11000个数,前10000个是0.0001,然后是1000个0.001
# 创建WeightedRandomSampler,1600为采样数
train_sampler   = WeightedRandomSampler(train_weights, 1600, replacement=False)
# 将sampler传给Dataloader,不再需要shuffle
gen             = DataLoader(train_dataset, batch_size=128, sampler=train_sampler, num_workers=8)

1.2、进行数据增强
几何操作、颜色变换、随机擦除、添加噪声等方法
参考其他人的结论
“过采样和分配权重哪个效果好?
answer1:之前在一些小数据集上做过测试,过采样的效果要好于分配权重
answer2:是哈,海康也是用的采样,估计是测试过了的。

二.loss层面

为不同的分类错误给予不同惩罚力度(权重),在调节类别平衡的同时,也不会增加计算复杂度。
2.1OHEM 和 Focal Loss
2.2BCEloss中的参数:https://zhuanlan.zhihu.com/p/509901427

loss_fn = torch.nn.BCEWithLogitsLoss(weight=None, reduction='mean', pos_weight=None)
loss = loss_fn(logits, y_true)

你可能感兴趣的:(深度学习,人工智能)