如何解决数据不均衡对CNN的影响

读《 The Impact of Imbalanced Training Data for Convolutional Neural  Networks 》有感,再加上自己的一些理解。
为什么会看到这篇文章呐?原因是我最近在做一个实验,finetuning caffenet来做一个120classes的分类器。遇到了一个问题就是loss一直不下降。大约维持在log(类别数)
左右。其中使用了很多trick,比如使用BN层,初始化从gaussian到xavier。都是没什么效果。师兄这时让我看看数据!一语惊醒梦中人啊!数据没有shuffle。也就是说在使用caffe进行训练时,同一个minibatch中的数据几乎来自同一个类。那怎么能行!将数据shuffle后,果然开始收敛了。但,为什么呐?为什么CNN不能这样训练啊?
另一篇我对这个问题进行了分析,感兴趣的可以移步:http://blog.csdn.net/u010725283/article/details/78929684
caffe中的优化方法默认是SGD,这里的SGD其实是minibatch-SGD算法,计算过程如下公式:

N就是minibatch 的大小。我们可以这样理解,将原始大的数据划分成了多份minibatch大小的数据。换句话说是用CNN在一个个minibatch上进行训练后的权重平均作为最后的权重分布。
minibatch其实是大数据集的一个采样,我们知道,合理的采样必须要和原始数据集保持相同的分布才是合理的。也就是每一个minibatch中的数据都是随机从原始数据中抽取的。
而caffe在读取数据时是从头到尾依次读取的,那么我们怎么能保证进来的数据是一个合理采样呐?方法其实很简单就是将原始数据随机打乱。
接着看这篇论文。

解决的问题:

原始数据不平衡,即有些类别的数据会很少,有些类别数据很多。

解决办法:

文中主要使用采样的办法,也是文中的oversampling方法,其实很简单,
对于每一类,随机选择一些图片进行复制,直到这个类别的图片数目和最大比重的种类的数目相等为止。简单粗暴。

实验与分析:

这篇文章的对比实验做的非常充分,感兴趣可以看一下。
分析了不同种不平衡造成的影响,以及oversampling后的结果分析。

总结:

文中讲到数据不均衡解决办法有三种方法:
1.sampling方法,对数据采样,直至数据分布平衡
2.在学习过程中,使用惩罚因子,数据少的种类最终的分类结果会变差,那就加上权重使它更好的分类
3.One-class learning,也就是异常检测。在有些种类极少的情况下,比如检测肿瘤,那么我们只学习没有肿瘤的情况,定好没有肿瘤类边界后,就可以找到异常情况的发生。




  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值