实际上笔者也没多少刷榜经验,毕竟不擅长,之前老大也没有任务指派,今年10月份得闲了个把月,没那么多事就参加了一个场景分类的比赛,链接如下,https://challenger.ai/competition/scene/leaderboard/test_a

刷了一个月之后最好成绩也就杀进前15然后就接着干项目去了。

与第一名差一个点,7000张测试图,80类,基本上每一类差1张图。到比赛结束的时候排在第20名左右,与第一名还是差一个点。说出去好像是有点不太好意思,但是作为第一次刷比赛,一个月也不能白费,毕竟绩效打在那里。现在的比赛听说还有专业刷榜团队的,也是666。

下面也简单分享一下。

0 刷的是什么比赛?

场景分类,80类日常生活中比较多的场景,这个在以后的社交应用中还是有需求的,相关最大的比赛是place365,有兴趣可以去看。眼下这个,是创新工场,今日头条,搜狗等一起搞的比赛,train数据集就不大,只有50000+,测试数据集7000+。

下面举10类吧

0/航站楼:airport_terminal

1/停机坪:landing_field

2/机舱:airplane_cabin

3/游乐场:amusement_park

4/冰场:skating_rink

5/舞台:arena/performance

6/艺术室:art_room

7/流水线:assembly_line

8/棒球场:baseball_field

9/橄榄球场:football_field

10/足球场:soccer_field

1 为什么叫第一境界?

我觉得怎么着刷榜这事也得有个三个境界,像笔者这样,一个人拿现有的模型,4块K40,兼职刷上一个月,最后提交也只融合了两个模型的,怎么看都是处于刚入门的第一境界,大部分人其实也就是这个境界。

而到了第二三境界,至少得有个集群,得有一群人来尝试各种方案,而顶尖的团队对网络结构肯定是需要调优设计的,历年夺冠的那些网络alexnet,googlenet,resnet,senet无一例外。

不过设计强大的网络结构从时间代价,计算资源代价和算法能力都有比较高的要求,大部分人可能就是从数据层面做文章了,比如清洗数据,数据增强,搞搞不均衡样本等。

2 怎么一步刷到比较优的单模型?

这是最关键的第一步。

有几点一定是要形成共识的。

(1) 由于我是只有4个卡,用caffe或者tensorflow都是不可能的,我用了mxnet,并且在训练的过程中都放开了所有参数,实际上也做过固定某些参数的实验,但是效果并不好。224的尺度,放开全部训练的话,4块卡resnet152 batchsize可以到96。在实验的过程中,batchsize越大,指标就越高,几个网络都能观测到相关结论。

(2) 由于训练数据少,使用当前数据从头训练大模型不太现实,所以,先找到相关数据集比赛finetune过的大网络,resnet系列找了一个resnet152,dpn系列找了一个dpn92,各自先训练。

(3) 从尽量大的模型开始,机器啃得动的就行,毕竟这个任务里面有很多类还是很难的,小网络搞不定,resnet系至少得50层以上。

在刷这个比赛的时候,从imagenet mxnet model的模型fine-tune过来,链接在下面。

http://data.mxnet.io/models/

实验了18,50,152层的网络,使用本比赛50000+的数据进行简单的参数调优,

解释一下,lr是学习率,Lr=0.01(10)代表在10个epochs后下降一个数量级,从0.01到0.001,实际上在10个epoch以后都收敛了,所以后面没有做更多step lr的比较,大家感兴趣可以去尝试。w是weight decay,m是momentum,bs是batch size,单个k40 gpu。

从上面可以看出,从18层到152层精度毫无疑问是提升的。虽然参数没有调到各自最优,但基本能反应问题。尤其注意的是res18我加了weight decay来增加模型复杂度,不然没有上90%的可能。从resent152到resent200指标就没什么提升了,而且res200远远没有res152参数好调。单模型单个crop 94%的精度已经差不多了,

(4) 理论上随着训练尺度增加,在一定范围内性能也会增加,但是训练尺度的增加会导致能使用的batchsize减小,所以笔者最后统一采用224这个尺度。听说有人用到了700以上的尺度,只能说,真土豪也。

(5) 单个模型,多个crop会对结果有所提升,有的团队用到了上百个crop,笔者最后用了10个crop,没有去尝试更多,毕竟测试也是很花时间,这点资源一个人搞不过来。

有了以上的共识后,那就开始干起来,过段时间我会重新整理把项目git传上去,前段时间服务器意外格式化丢了全部训练文件,一时还没有恢复。如果对此感兴趣,请持续关注。

总结:单模型,以resent152为例。

训练尺度224*224,数据增强采用了水平flip和随机crop,random resize参数照搬googlenet那套,放开所有参数,使用resnet152-place365,即在place365数据集上进行训练过的模型,然后使用当前的训练数据集进行finetune,validation数据集进行测试。

数据增强参数偷懒截个图,实际上这些mxnet全部都已经集成好了,直接设置开关即可。

训练参数,lr=0.01,分别在10,20,40个epoch时下调学习率,最后采用10个crop,分别为四个角,中心以及水平翻转。在试用了多个batchsize之后,最大的能用的batchsize取得最优,resnet152单个模型能到97%。

在测试的时候有trick,采纳dpn的思想,使用较小的尺度训练,使用较大的尺度测试,最终在略大于224的尺度上,有微小的提升,对于刷榜来说还有很重要的,毕竟0.5%可以干掉10个人。

3 怎么做模型融合?

不同网络架构,但能力相当的模型进行融合,结果会稳定提升。笔者单模型10个crop,resnet152得到0.971,dpn92得到0.965,两者融合后即到0.978。要想得到最优,需采用不同的epoch进行融合,这个需要花时间去测试;所以就会出现两个单模型最优,融合之后缺不是最优的情况。这个时候,需要把各自错误样本拿出来分析,我当时没有太多时间和耐心去尝试各种方案。

这就是提交比赛的最后结果,两个现有的模型在224尺度用4张卡训练,融合之后,在比赛结束前的一个月,能排在15名左右,比赛结束后我回去一看,test_a也在20名以内,test_b也差不多,由于test_b比较难,所有参赛队伍的成绩都下降了4个点左右。

4 哪些trick比较关键

虽然提交的结果非常简单,笔者还是实验过很多参数的,稍微有些经验拿出来分享下,有些参数是不能乱调的,有些则不需要调。

(1) finetune很关键

从相关大数据集上训练好的模型开始finetune,基本上可以肯定会比从不相关大数据集上训练的模型,或者从头开始训练更好,这个大家应该是通识了。

(2) 学习率lr和batchsize

学习率和batch size是成对的参数,batch size增大N倍,相当于将梯度的方差减少N倍,也就是梯度方差更小了,更加准确,更加容易跳出局部最优,带来的后果就是收敛更慢,这时候为了提高训练速度,可以将lr增加sqrt(N)倍。

学习率是最关键的参数了,没得说,只能自己从大到小开始尝试。

笔者列举一个例子:dpn92, lr_step_epochs='10,20,30,40',w=0,m=0,bs=64,

lr取0.001,0.005,0.01,0.01,分别看train和val的acc。

从小到大,从欠拟合到过拟合,很明显。

batch size相对来说没有lr那么敏感,但是对结果也是至关重要的。

下面是resnet152的batchsize的实验,mul_val是多个crop

下面是dpn92的batchsize的实验,mul_val是多个crop

看的出来,指标有所上升。

当然了,还是那句话,单个最优的模型融合起来并不能保证结果最优。

(3) weight decay和momentum

这两个参数,对于小模型的训练是比较关键的,不过越大越不敏感。

下面是res18的训练结果,从结果看来差异是很大的。

Res50,差距就不明显了。

Senet50也是。

我的结论是这个参数可以去调一调,不过对于大模型可能不是很必要,我都用的是0

(4) 测试网络

下面是单个crop和10个crop的比较

很明显,不管是什么网络,多个crop会有很明显的提升,上面稳定提升2%以上,更多的crop笔者没尝试,因为实在是太慢了。

另一方面,借鉴dpn的思想,用小尺度训练,大尺度测试可能也有微小的点提升,下面是一个比较。

(5) 数据增强

本任务中复杂的数据增强没怎么用,使用的是mxnet  level=1的数据增强,估计是因为模型已经在大数据库上训练过,au=1就是基本的crop,flip,random resize,au=2会做图像旋转,au=3会再加上颜色扰动,实际的项目中我们还是会做一点的。

就这么多,不知道你对是否有用,下回搞点机器搞点时间去刷个大榜试试。

话说有个问题,刷比赛的各位觉得这个好玩吗?

如何步入深度学习刷榜第一重境界相关推荐

  1. 深度|神经网络和深度学习简史(第一部分):从感知机到BP算法

    导读:这是<神经网络和深度学习简史>第一部分.这一部分,我们会介绍1958年感知机神经网络的诞生,70年代人工智能寒冬以及1986年BP算法让神经网络再度流行起来. 深度学习掀起海啸 如今 ...

  2. (转)神经网络和深度学习简史(第一部分):从感知机到BP算法

    深度|神经网络和深度学习简史(第一部分):从感知机到BP算法 2016-01-23 机器之心 来自Andrey Kurenkov 作者:Andrey Kurenkov 机器之心编译出品 参与:chen ...

  3. pycharm remote 远程项目 同步 本地_利器:PyCharm本地连接服务器搭建深度学习实验环境的三重境界...

    作为实验室社畜,常需要在本地使用Pycharm写代码,然后将代码同步到服务器上,使用远程登录服务器并运行代码做实验. 这其中有很多事情如果没有好的工具,做起来会非常麻烦. 比如如何快速同步本地与服务器 ...

  4. python未来人工智能主流_python深度学习,未来人工智能三大境界的划分

    原标题:python深度学习,未来人工智能三大境界的划分 仙侠小说想必很多人都看过,里边让小编久久不能忘怀的便是这些修仙之人的境界划分情况.同样,在我们生活当中,清朝学者王国维曾用三句古诗词来诠释人生 ...

  5. 学习算法的七重境界,我在撸串境界,你在哪一重?

    作者 | liuyubobobo 来源 | 是不是很酷 今天这篇推文,聊一聊我眼里的,知识掌握的七个境界. 第一重境界:撸串境界 知识掌握的第一重境界,我管它叫"撸串境界".什么意 ...

  6. 重学《动手学深度学习》 —— 深度学习简介(第一章)笔记

    深度学习简介 本章地址:https://tangshusen.me/Dive-into-DL-PyTorch/#/chapter01_DL-intro/deep-learning-intro 仅作为私 ...

  7. fast.ai 深度学习笔记:第一部分第五课

    原文:Deep Learning 2: Part 1 Lesson 5 作者:Hiromi Suenaga 课程论坛 一,引言 没有足够的关于结构化深度学习的出版物,但它肯定出现在行业中: 结构化深度 ...

  8. 深度学习环境搭建第一步----Ubuntu 安装(win7 + win10)

    Windows下安装Ubuntu 16.04双系统 一.Win7 装  Ubuntu 1. 下载,四个版本,区分32和64位,优麒麟 16.04 LTS(长期支持)版本 来自 <http://c ...

  9. 2017-10-20 西电 新一代人工智能与深度学习“国际”研讨会第一天见闻

    深度学习大潮袭来,不管是不是坑,也义无反顾地跳进去.博主小白+,2017年中段才半正式转行进入该领域,之前在研究生期间接触过深度学习的概念,仅仅是概念!基本从零开始,至今约半年时间.期间因为其他工作原 ...

最新文章

  1. centos7+ansible自动化工具使用
  2. ie8下jquery改变PNG的opacity出现黑边,ie6下png透明解决办法
  3. matplotlib练习
  4. Mina2中IoService
  5. kafka实现异步发送_Kafka Producer 异步发送消息居然也会阻塞?
  6. Android新手入门2016(14)--FragmentTabHost实现选项卡和菜单
  7. 习题3.10 汉诺塔的非递归实现 (25分)
  8. 开箱即用的 Prometheus 告警规则集
  9. D-Link 不止暴露固件镜像密钥,还被曝5个严重0day
  10. Datadog Agent是啥?它消耗什么资源?
  11. char *p=new char
  12. java队列 双队列_Java队列– Java队列
  13. 45. 正确区分count、find、binary_search、lower_bound、upper_bound和equal_range
  14. 工作要求,写了一些没用的设计文档
  15. java 如何将word 转换为ftl_3种方法轻松将PDF转换为Word文档,办公必备
  16. 欢迎体验 | Android 12 开发者预览版 3
  17. 一文了解成分句法分析
  18. 新增用户时输入账号已存在(全局异常处理)
  19. 【ClickHouse内核】MergeTree表引擎语法结构
  20. Java程序设计实验(二):类的创建和封装实验

热门文章

  1. C连接MySQL数据库开发之Windows环境配置及测试
  2. mybatis教程--实现增删改查的入门教程
  3. struts2教程(4)--类型转换
  4. WEB前端:浏览器(IE+Chrome+Firefox)常见兼容问题处理【02】
  5. Spring IOC注解方式
  6. 二叉树的基本概念以及基本操作
  7. 多线程情况下创建连接池
  8. 每天学习java一小时_java再学感受 - 编程一小时的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. 观山湖区计算机培训班学校,2020年观山湖区教育系统办公室主任培训顺利开班...
  10. 网工协议基础(3) IP地址