如何步入深度学习刷榜第一重境界
实际上笔者也没多少刷榜经验,毕竟不擅长,之前老大也没有任务指派,今年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会再加上颜色扰动,实际的项目中我们还是会做一点的。
就这么多,不知道你对是否有用,下回搞点机器搞点时间去刷个大榜试试。
话说有个问题,刷比赛的各位觉得这个好玩吗?
如何步入深度学习刷榜第一重境界相关推荐
- 深度|神经网络和深度学习简史(第一部分):从感知机到BP算法
导读:这是<神经网络和深度学习简史>第一部分.这一部分,我们会介绍1958年感知机神经网络的诞生,70年代人工智能寒冬以及1986年BP算法让神经网络再度流行起来. 深度学习掀起海啸 如今 ...
- (转)神经网络和深度学习简史(第一部分):从感知机到BP算法
深度|神经网络和深度学习简史(第一部分):从感知机到BP算法 2016-01-23 机器之心 来自Andrey Kurenkov 作者:Andrey Kurenkov 机器之心编译出品 参与:chen ...
- pycharm remote 远程项目 同步 本地_利器:PyCharm本地连接服务器搭建深度学习实验环境的三重境界...
作为实验室社畜,常需要在本地使用Pycharm写代码,然后将代码同步到服务器上,使用远程登录服务器并运行代码做实验. 这其中有很多事情如果没有好的工具,做起来会非常麻烦. 比如如何快速同步本地与服务器 ...
- python未来人工智能主流_python深度学习,未来人工智能三大境界的划分
原标题:python深度学习,未来人工智能三大境界的划分 仙侠小说想必很多人都看过,里边让小编久久不能忘怀的便是这些修仙之人的境界划分情况.同样,在我们生活当中,清朝学者王国维曾用三句古诗词来诠释人生 ...
- 学习算法的七重境界,我在撸串境界,你在哪一重?
作者 | liuyubobobo 来源 | 是不是很酷 今天这篇推文,聊一聊我眼里的,知识掌握的七个境界. 第一重境界:撸串境界 知识掌握的第一重境界,我管它叫"撸串境界".什么意 ...
- 重学《动手学深度学习》 —— 深度学习简介(第一章)笔记
深度学习简介 本章地址:https://tangshusen.me/Dive-into-DL-PyTorch/#/chapter01_DL-intro/deep-learning-intro 仅作为私 ...
- fast.ai 深度学习笔记:第一部分第五课
原文:Deep Learning 2: Part 1 Lesson 5 作者:Hiromi Suenaga 课程论坛 一,引言 没有足够的关于结构化深度学习的出版物,但它肯定出现在行业中: 结构化深度 ...
- 深度学习环境搭建第一步----Ubuntu 安装(win7 + win10)
Windows下安装Ubuntu 16.04双系统 一.Win7 装 Ubuntu 1. 下载,四个版本,区分32和64位,优麒麟 16.04 LTS(长期支持)版本 来自 <http://c ...
- 2017-10-20 西电 新一代人工智能与深度学习“国际”研讨会第一天见闻
深度学习大潮袭来,不管是不是坑,也义无反顾地跳进去.博主小白+,2017年中段才半正式转行进入该领域,之前在研究生期间接触过深度学习的概念,仅仅是概念!基本从零开始,至今约半年时间.期间因为其他工作原 ...
最新文章
- centos7+ansible自动化工具使用
- ie8下jquery改变PNG的opacity出现黑边,ie6下png透明解决办法
- matplotlib练习
- Mina2中IoService
- kafka实现异步发送_Kafka Producer 异步发送消息居然也会阻塞?
- Android新手入门2016(14)--FragmentTabHost实现选项卡和菜单
- 习题3.10 汉诺塔的非递归实现 (25分)
- 开箱即用的 Prometheus 告警规则集
- D-Link 不止暴露固件镜像密钥,还被曝5个严重0day
- Datadog Agent是啥?它消耗什么资源?
- char *p=new char
- java队列 双队列_Java队列– Java队列
- 45. 正确区分count、find、binary_search、lower_bound、upper_bound和equal_range
- 工作要求,写了一些没用的设计文档
- java 如何将word 转换为ftl_3种方法轻松将PDF转换为Word文档,办公必备
- 欢迎体验 | Android 12 开发者预览版 3
- 一文了解成分句法分析
- 新增用户时输入账号已存在(全局异常处理)
- 【ClickHouse内核】MergeTree表引擎语法结构
- Java程序设计实验(二):类的创建和封装实验
热门文章
- C连接MySQL数据库开发之Windows环境配置及测试
- mybatis教程--实现增删改查的入门教程
- struts2教程(4)--类型转换
- WEB前端:浏览器(IE+Chrome+Firefox)常见兼容问题处理【02】
- Spring IOC注解方式
- 二叉树的基本概念以及基本操作
- 多线程情况下创建连接池
- 每天学习java一小时_java再学感受 - 编程一小时的个人空间 - OSCHINA - 中文开源技术交流社区...
- 观山湖区计算机培训班学校,2020年观山湖区教育系统办公室主任培训顺利开班...
- 网工协议基础(3) IP地址