专栏名称: AI科技评论
「AI科技评论」是国内顶尖人工智能媒体和产业服务平台,专注全球 AI 业界、学术和开发三大方向的深度报道。
目录
相关文章推荐
爱可可-爱生活  ·  【[260星]Agentic ... ·  7 小时前  
爱可可-爱生活  ·  [LG]《PENCIL: Long ... ·  15 小时前  
爱可可-爱生活  ·  【[354星]ttt-rl:用C语言实现的强 ... ·  23 小时前  
宝玉xp  ·  Satya: Microsoft 365 ... ·  昨天  
51好读  ›  专栏  ›  AI科技评论

干货 | 图像比赛的通用套路有哪些?Kaggle比赛金牌团队为你解答

AI科技评论  · 公众号  · AI  · 2017-08-11 15:01

正文

AI 科技评论按: Kaggle 是全世界首屈一指的数据科学、机器学习开发者社区和竞赛平台,来看看 Kaggle 亚马逊雨林比赛金牌团队的经验分享吧。

日前,中山大学CIS实验室的研二学生刘思聪为我们带来了一场精彩的分享。他所在的队伍在 Kaggle 上的亚马逊比赛中获得了金牌,在这次的分享上,他为我们详述了比赛过程中所获得的经验以及图像比赛中的一些通用套路。

下面是他的分享内容, AI 科技评论 做了不改变原意的编辑整理:

大家好,我叫刘思聪,来自中山大学CIS实验室。我们前段时间参加了Kaggle上面一个亚马逊雨林的卫星图像比赛,取得了不错的成绩,然后也得到了一些经验,今天就给大家分享一些我们总结的图像比赛经常用到的套路。

我会对比赛做一个简单的介绍,讲一些通用的方法,比如模型的构建、分析、改善,以及比赛中我们的一些数据增强案例。另外,K折交叉验证在Kaggle比赛中,不管是图像比赛还是文本比赛都是比较常用的一个方法,我会讲一下为什么我们要做K折交叉验证以及我们在划分K折的时候有哪些要注意的点。然后我会讲在Kaggle比赛中模型集成上涉及到的技巧,最后会介绍一下我们队伍的基本情况。

先大致的说一下这个比赛,很多人看到名字后会误以为这是亚马逊公司办的比赛,其实这两者完全没有关系。它之所以被叫亚马逊是因为它的卫星图像来自亚马逊雨林,我们要做的任务是在给出的一些卫星图片上打上标签分类,一共有17个不同的标签。

我们取得的成绩如PPT所示。

另外还有我们的结果分析图。

接下来讲怎么构建单模型。

这是分享最重点的一部分,涉及到究竟是使用框架提供的预训练模型还是自己随机初始化模型去搭建一个模型,另外还涉及到如果要用预训练模型,有哪些可以用。在明白这个之后我就会大致介绍一下怎么去训练一个Baseline模型,进行结果分析与改进。

首先讲一下 是用预训练模型还是使用随机初始化参数模型 ,这个选择对于不同比赛来说是不同的。预训练模型的好处是,我们可以利用ImageNet上预训练的参数,ImageNet是一个非常大的数据集,可以在上面训练,让模型得到比较好的提升。但是如果我们使用预训练模型,也就意味着大体的模型框架都是保持和它预训练时候设置的一样,那样能做的调整就比较少。如果我们使用随机初始化参数,对于模型,好处是几乎可以说想怎么搭就怎么搭,坏处就是我们没办法用到ImageNet上预训练的参数。

我们在比赛开始的时候就做了一些实验,自己搭建了一些随机初始化参数模型和预训练模型,发现我们任务中随机初始化参数模型的收敛速度等都远远比不上预训练模型,所以我们后面的比赛就几乎一直在用预训练模型,至少在单模型阶段是这样的。

确定了要使用预训练模型之后,会考虑具体选择哪种。 其实几乎所有不同的框架都有提供自己的预训练模型,除了有一些共通的之外,还有一些不同的,有一些预训练模型只有某个框架有,有一些预训练模型大家可能都有比较分析,我们最后选择了一个PyTorch的框架。我们选择PyTorch的原因是因为首先它的代码比较轻量级,然后提供的预训练模型的种类比较多,我们用它写起来也很方便,很快就可以构建模型,大家基本上一学就会,它涵盖了绝大多数模型。

在选择了工具还有可以用的模型之后,就可以开始动手去训练一个模型。 一般来说,我们最开始有做一个Baseline,这个是很正常的套路,一般只有训练一个模型,才可以对这个模型有大概的感觉。比如可以训练ResNet18,这比较简单。然后我们稍微划分一下训练集,比如说80%训练,20%验证,再比如用Adam做优化,调整一下学习率,试了这几个之后就大概可以去调整训练出比较好的模型。

一开始我们也不知道哪个范围的学习率是比较合适,我们用0.0001这个数值是比较好的,模型收敛比较快,也比较稳定,一般学习率过大的话训练会抖动,然后过小的话收敛比较慢,这个过程中我们也用到队员开发的一个工具Hyperboard,可以实时记录训练过程中那些训练曲线的变化,然后接口也比较简单,在这样一轮训练下来之后,我们一般就可以得到反馈,然后去做结果分析,分析完之后我们才能考虑下一步要怎么去改进训练或者是数据。

我们当时在比较小的模型上观察到结果是这样的,模型一开始收敛的挺快,然后它开始过拟合,训练集上Loss下降,验证集Loss反增。我们当时分析了一下,觉得官方提供的训练数据集只有4万个样本,相对这个任务来说是比较小的,比较容易发生过拟合,然后我们就用人类的先验来对它做一个数据增强,这样可以把原来的样本用一些手段把他们变的更多,然后有了这些经过数据增强的样本,有更多的数据的话,训练出来模型就比较难过拟合。用数据增强解决过拟合的问题后,我们就开始可以对模型进行调整。

解决了数据不足之后我们就可以 考虑使用更大模型 了。最简单的提升模型方法是使用参数规模更大的预训练模型,另外一种就是对模型进行一些改动,用预训练模型很难对卷积层去做一些改动。

我们大部分的改动都是在卷积层之后的全连接层进行的,我们后面也可以改动卷积层最后的Global Pooling层的输出大小,还可以把两个小的模型的输出特征拼在一起,然后再进行分配,拼成一个大模型。然后还可以增加Batchnorm、dropout、L2等,但在比赛中没有观察到这些参数有非常大的影响,所以我们后面并没有对这些做仔细的调整。

确定了大体的框架还有使用的模型,接下来就是比较枯燥的 调参阶段 ,在这里非常重要的一个参数是初始学习率,刚才讲到我们选择大概0.0001这样一个基准的学习率,只是大概确定的一个范围,我们可以再做一些仔细调整。调整这个初始学习率,对最后的收敛也是有影响的。

还有就是Batch size的选择,尽量把GPU占满,一般来说是32-128之间,有时会做一些微调。一般来说,在训练的过程中,下降到一定程度之后可能就完全收敛了,或者是开始出现过拟合,这时候经常会做的一个操作就是把整体的学习率降低,这样训练往往会提升整理的效果。在调参的过程中,也要不断对参数跑出来的结果做记录,去做分析和验证,看哪些参数会比较好。

我们几乎把十几个模型都跑了一遍,有的跑了好几遍,我们发现ResNet效果是最好的,DenseNet效果紧随其后。VGG,Inception v3效果差一点。最差的是AlexNet和SqueezeNet,因为前者确实比较老而且效果也不佳,后者做的是一些压缩工作,整体上参数不会很多,所以效果比较差一些。Inception v4和Inception Res v2效果非常糟糕,我们后来没有使用。另外有些模型虽然总体比较差,但他们之间具有多样性,Ensemble到一起可以提升性能。

接下来讲一下数据增强。

我会为大家介绍一下有哪些 数据增强的方法 ,有一个就是调整亮度、饱和度、对比度。这些调整之后,我们可以认为它是一个新的样本。然后另外来说我们要通过人类的先验,我们可以看到,把一张河流的图调亮一点,它还是一条河流,但我们可以得到一个亮度和原来不同的样本。

然后此外还常用的有随机裁剪一幅图,可以把裁剪之后的图作为输入,但是在这个比赛中我们并没有用到这种技术,因为我们考虑到有一些图片,如果去做一些随机裁剪,可能会把图里面的一些特征剪掉。

然后还有随机缩放,水平/垂直翻转,旋转,把图片变得模糊,加高斯噪声等,这些都是很常见的方法,不过并不是每一种都适合。

对于任何任务来说,我们都应该根据实际情况来选择一个好的数据增强。好的数据增强应该是这样:增强过的图片应该尽量接近原分布。对于这个比赛,我们主要使用的就是翻转和旋转这两个手段,比如左右翻转。旋转的话我们把图像进行90度、180度、270度这样去转。翻转和旋转配合,我们可以获得八种角度的一张图,并且图像的标签不会发生变化。







请到「今天看啥」查看全文