0.前言
在解决一个分类问题时,遇到样本不平衡问题。查找CSDN后,以及知乎后,发现网上有很多类似于欠采样 ,重复采样,换模型等等宏观的概念,并没有太多可实际应用(代码)的策略。经过一番查找和调试和修改,最终找到3个相对靠谱的策略,故总结此文给有需要同志,策略均来自网络,本人只是进行了部分代码修改和可用性测试。以下将简单介绍各个策略的机制以及对应代码(亲测能跑通)。
NOTE:下述代码均是基于caffe的,而且实现策略都是通过新增自定义层。主要流程大致为:修改caffe.proto–>导入hpp/cpp/cu–>重新编译–>执行。
1.带权重的softmaxLoss
softmaxLoss代码——github传送门
在样本不均衡分类问题中,样本量大的类别往往会主导训练过程,因为其累积loss会比较大。带权重的softmaxloss函数通过加权来决定主导训练的类别。在具体的实现过程中增加pos_mult字段(指定某类的权重乘子)和pos_cid字段(指定的某类的类别编号)两个参数来确定类别和当前类别的系数,通过系数来控制当前类别在反向传播中的重要性。(若pos_mult=0.5,就表示当然类别重要度减半)。
(1)修改caffe.proto文件
编辑src/caffe/proto/caffe.proto文件,主要是在原有的SoftmaxParameter字段上添加了pos_mul和pos_cid字段。
optional float pos_mult = 3 [default = 1];
optional int32 pos_cid = 4 [default = 1];
(2)导入hpp/cpp/cu文件
将weighted_softmax_loss_layer.hpp