小林子

  • 55

    获得赞
  • 1

    发布的文章
  • 4

    答辩的项目

图像分类、识别炼丹心得(我不是骗键盘的小林子)

PyTorch ResNet DenseNet EfficientNet

最后更新 2020-03-30 18:26 阅读 12102

最后更新 2020-03-30 18:26

阅读 12102

PyTorch ResNet DenseNet EfficientNet

纯分享,有不足,还望指正

首先声明本人自去年九月接触FlyAI,未拿过第一,只想单纯分享经验,一个梦想致力于开源路上的小男孩。但是平台可以帮人快速成长是一点没错的,当你看到诸多优秀的人,你会有一种为什么我不行的错觉,这篇文章就是希望帮你找到你在图像分类中可能忽视的细节。

当第一次做图像分类的步骤应该是啥?

  1. 观察数据:数据长什么样,标签几类啊,图像大小啊。
  2. 数据增强:最开始最好什么也没有,或者肉眼感觉可以做的数据增强(仅限部分赛题,肉眼和CNN理解存在差距)
  3. 模型选择:resnet,densenet,efficientnet个人最常用的三种,选择一个浅层的开始。
  4. 观察性能:有了数据,模型,然后就提交看一下可以获得多少分啊!

看了分数之后,发现怎么和第一差好多我该怎么办?

  1. 我模型不对,我换个模型试试?
  2. 我数据增强不好,我改一改?

注意,我想说的是,以上这两条再单模的时候十分关键,模型和数据增强很大一部分决定了你的分数上限,所以在调参的时候可以跑一编常用的模型res34-50-101;wrn-50-101等等等,在换模型的时候注意不要改动数据增强了。然后你在修改数据增强,找到一个最好的数据增强。

这个时候就有小伙伴问了,什么是最好的数据增强?

  1. 如果你fai足够,你就尝试自己认为可能的数据增强,找到一个合适的。
  2. 自己写好数据增强好,自己把增强后的数据画出来看看,如果差距同类中的太多,肯定不行啊!
  3. 当你遇到瓶颈后,你可以分析bad case,看一下怎样的数据增强可以让其预测正确?(我在很多分类经验中都看到过这一点,虽然我从来没用过,因为我是个懒人)

补充一点比较关键的optimizer和 lr_scheduler

  • 如果你不知道如何使用优化器:Adam,学习率3e-4。
  • 如果你不明白学习率递减策略: ReduceLROnPlateau(patience通常3、4)和余弦学习率选一个

数据增强,模型都说完了,怎么上分才是关键啊,一下我就列举我在FlyAI,用到过的所有Trick(pytorch)。

  1. 数据重新划分:官方给的是6:2,第一步我默认直接0.1或者0.2,这点我觉得也是大多数人默认的技术了。
  2. 标签平滑:适用于有噪声的标签,我在标签种类多的比赛中常用,少的几乎不用,来自于经验。个人取舍!
  3. 样本平衡:几乎不用,大部分评估指标acc(因此你可以揣测测试样本也是如此的,过大的权重不利于样本多的类更准确)。如果你非要用,搜索ImbalancedDatasetSampler即可使用。
  4. warmup:最开始我用小的学习率训练,防止一开始底层的权重被拉偏了。当数据量较少的时候我会使用。当数据量很大的时候,我通常为了剩fai这里就不做过多的设置。搜索GradualWarmupScheduler即可使用
  5. cutout以及随机擦除:这里有时候是涨分点,例如你画我猜的时候就很好用。这个trick在pytorch的transforms中自带了,可想而知,这个还是常用的。
  6. Mixup:我看到已经有大佬分享这个了,我只能说,用这个我从来没有上过分,不知道是不是自己太菜了!!所以,这个大家自己试试。在尝试的时候注意,如果你已经用到了cutout的话,再用是不是有点就不好了,个人理解。
  7. 分层学习率:backbone和fc使用不同的学习率,这点我感觉和warmup有点相似之处,所以大家各取所好就好。具体实现可以自己写网络类,或者根据网络层的名字在optimizer里指定。
  8. Dropout和BN:抑制过拟合的好手段,将最后的fc前面加一层DP或者BN,或者自己重新写一下FC。这里分享以下,我以前Keras,后来Pytorch,所以在修改fc的时候有点不适应。后来发现只需要 nn.Sequential( nn.Dropout(0.2),nn.Linear(nfs, cfg.num_class) )即可。
  9. TTA:测试增强,这也是几乎必用的手段,没有副作用(在不要求复杂度的情况下)。模型预测的时候,使用数据增强的多张照片,取结果的平均值。这里的数据增强,我通常直接使用训练时候的数据增强。如果你分析了bad case在这里修改一下增强效果,涨分利器。
  10. 模型融合:Flyai2.0更加开放,使得模型融合变得非常简单,所以不妨试一下,你会发现新大陆,就像我在X肺炎检测里说的,在过拟合的情况下,通常能带来稳定的涨点,也是各路比赛要求的。
  11. 交叉验证:这里就和模型融合有点类似,区别在于数据上而已,使用不同的数据训练多个模型。有时候也是涨点利器。

今天就分享这么多,以后可能会更新,怎么合理使用这些技巧呢?每次都试一遍不是 太扯淡了吗?

这里要说的就是,当你看了很多心得,你发现为啥感觉大家说来说去就这么多,我好像都明白,但是为什么我的分数不如别人呢?哈哈,我也有同样的问题,这其中有运气的成分,但不可否认别人的经验和技术的差距,随便一个参数(例如学习率)别人设置的可能就比你设置的结果好一些。

不乏大佬可以重新修改底层网络结构,所以在抱怨的时候,为何不去尝试一点新的东西,不分析一下bad case呢?例如最新的cbam,res2net,cutmix,别的数据增强包啊,优秀的预训练模型啊,kaggle就有你画我猜原题目啊,对吧?

如果觉得我说的有用,就给我点个赞吧!


PS:

本人懒人,以上trick我在接触平台的时候就已经开始收集各种实现方式了,很多大佬也是如此。所以你看,同样一个题目,别人可能直接修改少量的参数就比较有好的效果了,所以把好用的就封装起来,下次直接用,祝大家可以取得高分。

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,转载请附上原文出处链接和本声明。
本文链接地址:https://www.flyai.com/article/art40046022150ac8d9b608f009
讨论
500字
表情
发送
删除确认
是否删除该条评论?
取消 删除