前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据受限的Kaggle图像分类的最新获奖技术

数据受限的Kaggle图像分类的最新获奖技术

作者头像
代码医生工作室
发布2019-10-23 20:16:15
1K0
发布2019-10-23 20:16:15
举报
文章被收录于专栏:相约机器人相约机器人

作者 | Kayo Yin

来源 | Medium

编辑 | 代码医生团队

在本文中,将介绍用于课堂内Kaggle挑战的方法。花了大约两个星期的时间在挑战赛上,最终提交分数为0.97115,使在最终排行榜上排名第二。

https://www.kaggle.com/c/cs-ioc5008-hw1/overview

挑战介绍

提出的挑战是具有13个 类的自然图像分类任务。这项挑战的第一个困难是缺乏可用的数据:仅3 859张用于训练的图像。挑战的规则是在训练期间也不要使用外部数据。如果数据很少,该模型将更容易过度拟合而无需学习概括。

而且,由于这些图像是灰度图像,因此与诸如ImageNet数据集之类的彩色图像相比,它们包含的信息更少,因此,彩色图像上的预训练模型无法直接应用于此任务。在进一步检查数据集后,许多类都包含视觉上非常相似或包含相同元素的图像。当混淆此类时,模型将失去准确性。

图片分类的一些例子0

数据处理

首先,数据集中的图像并非都具有相同的尺寸,因此在将所有图像输入模型之前都要调整其大小。一半以上的训练图像的尺寸为256 x 256,因此将其他图像调整大小或裁剪为该尺寸。

还将应用归一化。最初,图像表示为张量,像素值的范围为0到255。将每个值简单地除以255即可重新缩放并获得0到1之间的值,这些值是神经网络首选的。此外,将对比度拉伸应用于所有图像以增强图像。这将有助于模型更清楚地“查看”图像中的细节。

这些类也不平衡,这意味着每个类之间的数据量不相等。这将使模型或多或少地偏向某些类别。为了解决此问题,人为地添加了更多图像,以使每个类别具有与最大类别一样多的图像。要从小类中重新采样,会在图像中随机裁剪一个区域以创建一个新样本。这是基于这样的假设,即裁剪后的图像将包含该类特征相同的元素。

最后,随着深层网络在大量训练数据上的表现并得到更好的概括,将执行数据扩充。目标是人为地创建包含同类特征的新图像。为此,使用的技术总结如下:

在开始训练之前,将数据集分为一个训练集(80%)和一个验证集(20%)。将以上讨论的所有处理技术都应用于这两个集合,除了仅在训练集合上使用的图像增强。

迁移学习

由于数据集包含与ImageNet中相似的图像,因此将从在ImageNet上进行了预训练的CNN模型开始。想法是冻结可以捕获通用特征的预训练模型的较低层,同时将较高层微调到特定域。还重新定义了最后一层以输出13个值,每个类一个。

ImageNet数据集样本

PyTorch提供了几种具有不同架构的预训练模型。其中,ResNet18是我采用的体系结构,因为它在运行5个时期后运行各种体系结构后,在对数据进行训练后可提供最佳的验证准确性。在尝试了不同数量的冷冻层后,发现7个是最好的。还使用了SGD优化器来减轻重量,以防止过度拟合。

学习率调度

为了进一步改善结果并使模型收敛到全局最小值,要调整学习率。不是通过实验确定最佳学习率,而是选择使用循环学习率调度。这种方法使学习率周期性变化,从而使模型收敛到几个局部最小值。它还消除了“手工”寻找最佳学习率的需要。

快照集成

集成方法在改善模型的整体性能方面非常强大。但是,单独训练几个不同的模型进行集成学习在计算上也很昂贵。这就是为什么选择将快照集成与循环LR调度结合使用的原因。

快照集成可在训练期间定期保存模型的参数。这个想法是在循环LR调度期间,模型收敛到不同的局部最小值。因此,通过将模型参数保存在不同的局部最小值处,获得了一组可以为预测提供不同见解的模型。这使可以在单个训练周期中收集模型的整体。

对于每幅图像,将每个“快照”模型的类别概率预测串联起来,以形成一个新的数据点。然后,将这些新数据输入到XGBoost模型中,以基于快照模型进行预测。

子类决策

在检查单个模型的验证集上的混淆矩阵后,发现它常常使一类混淆同一类。实际上,发现三个经常混淆在一起的子类:

  • “房间”:卧室,厨房,客厅,办公室
  • “自然”:海岸,森林,山脉,野外,高速公路
  • “城市”:市区,街道,高层建筑

而且,该模型已经非常擅长区分这些子类(并查找郊区)。要获得出色的性能,剩下的就是模型可以准确地识别子类中的分类。

为此,使用与以前相同的方法在每个子类上训练三个新的单独模型。有些班级的训练数据很少,因此增加了数据扩充的数量。还发现了针对每个子类调整的新参数。

在预测期间,首先使用在整个数据集上训练的模型。然后,对于获得的每个预测,如果类别概率低于某个阈值,则取而代之以相关子类别模型预测的类别。

抗锯齿

大多数现代卷积网络,例如ResNet18,都不是位移不变的。网络输出可能会发生巨大变化,只需对输入进行很小的移动或平移即可。这是因为卷积网络中的跨步操作忽略了Nyquist采样定理和别名,从而打破了移位等方差。

决定采用最近在2019年4月的论文中提出的抗锯齿方法。只需在网络的卷积层之后添加一个“ BlurPool”层即可,这是一个模糊滤波器和一个子采样层。事实表明,这种方法不仅可以改善图像不同移位之间的分类一致性,而且可以提高归纳的准确性,从而提高分类精度。

使用了经过预训练的抗锯齿ResNet18模型来对挑战的数据集进行微调。借助抗锯齿功能,希望通过将模型推广到图像转换和平移来克服因数据稀缺而造成的过度拟合。

结果汇总

所使用的方法可以总结如下:

在没有任何处理的情况下,对ResNet18模型的数据进行5个时期的微调,除了调整大小外,测试精度为0.91442。这显示了转移学习的显着效率-只需很少的数据和计算,该模型就已经可以在相关任务上显示出良好的性能。

添加数据增强和训练10个纪元以上,获得0.93076的测试精度。这证实了拥有大量训练数据集的重要性以及增强技术的可扩展性。

加上班级平衡和学习率安排,测试准确性达到0.94230。此外,混淆矩阵表明,平衡后,该模型可以更准确地预测代表性不足的类别。这也表明学习率是模型收敛的重要参数。

然后,在对所有数据进行训练的模型上集成快照,测试精度提高到0.95000。这说明了循环LR调度如何使我们能够通过具有不同行为的单个训练周期模型来获得数据,并且XGBoost元学习者可以从其预测中提取有用的信息。

通过对比拉伸所有图像以及特定子类上的训练模型并将其预测结合起来,测试精度提高到0.95865。混淆矩阵显示出在子类中准确分类的改进,尤其是对于“城市”子类。开发在某些类上是“专家”的模型并将其与擅长区分子类的模型一起使用是非常有效的。

最后,在对ResNet18网络进行抗锯齿并组合训练和验证集以使用所有可用于训练的带注释数据之后,测试精度将提高到0.97115。抗锯齿是提高泛化能力的强大方法,当图像数据有限时,抗锯齿至关重要。

其他想法

这是必须解决的其他一些想法,这些想法要么效果不好,要么没有尝试的方法。

单通道图像

图像是灰度的,因此尽管在加载图像时将它们编码为三个通道,但它们可以表示为单通道矩阵。这种降维可以在保留所有必要信息的同时加快训练速度,但是通过实验,这种方法显示出在不显着加快训练速度的情况下会失去准确性。

其他合奏方法

还尝试过对通过其他方式检索的模型进行整合,例如在使用不同处理方法(使用/不使用类平衡,使用不同的图像增强技术,使用不同的数据增强方法)后在图像上训练的模型,但是这些方法在计算上更加昂贵,并且无法提供明显的效果更好的准确性。

生成对抗网络

如前所述,数据增强和类平衡在模型性能中起着关键作用。除了经典的图像处理之外,生成模型只能用于合成带注释的数据。例如,DAGAN模型可用于数据扩充,而BAGAN可用于平衡。

灰度ImageNet预训练

提供的数据集中的图像与组成ImageNet数据集的自然图像具有相似的内容,不同之处在于图像是黑白的。因此,在灰度图像上进行预训练的模型对于该任务将更加重要。

人工图像着色

如果无法获得灰度图像的预训练模型,那么下一个想法就是对图像进行人为着色,以期添加更多信息。确实存在针对人工图像着色的经过预先训练的模型,并且可以公开获得。

感谢阅读,希望喜欢这篇文章!可以在GitHub上找到方法的完整代码。

https://github.com/kayoyin/GreyClassifier

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 相约机器人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档