雷锋网推:本文是为AI研习公司编译的技术博客,原标题为ka ggle #1WinningapProachForimageclassificationchallenge,作者为Kumar Shridhar。

翻译|京鹏张小恬蒋华烈程磊校正|余杭整理| MY

植物幼苗分类竞赛冠军

本文记录了我为参加Kaggle植物幼苗分类竞赛而采用的方法。 我连续几个月位居榜首,最终排名第五。 这些方法通用性强,也可以应用于其他图像分类任务。

Kaggle是预测建模和分析竞赛的平台,统计人员和数据挖掘人员参与竞争,生成预测和描述公司和用户上传数据集的最佳模型。 这种众包方法有无数种可用于预测性建模任务的战略,并依赖于无法事先知道哪些技术和分析最有效这一事实。 1

任务概述

能把杂草从作物的苗里分出来吗?

有效的解决办法意味着作物产量和环境管理更好。

阿尔斯大学信号处理组与丹麦南方大学合作,发布了一组包含不同生长阶段的12种约960种植物的图像的数据集[1] [2]。

kaggle大数据竞赛(kaggle分类比赛-编程之家

植物样品之一:繁缕[3]

上述图像数据库已公开。 包含带注释的RGB图像,分辨率约为每毫米10像素。

利用基于F1分数的指标评价分类结果。 数据集链接到URL [ 13 ]

下图说明了数据集中的所有12个类。

kaggle大数据竞赛(kaggle分类比赛-编程之家

图像分类任务包括五个步骤:

步骤1:

机器学习的首要任务是分析数据集,然后进行任意算法。 为了理解数据集的复杂性,这一步很重要,最终有助于算法的设计。

图像和类的分布如下。

kaggle大数据竞赛(kaggle分类比赛-编程之家

如上所述,这包括12种共计4750个图像。 但是,从以上情况可以看出,各类值的分布不均匀,图像类的数值分布从最大654张到最小221张不等。 这明显地说明了数据不均匀,但是为了得到最佳的结果,有必要对数据进行比较研究。 第三步,完成这个任务。

kaggle大数据竞赛(kaggle分类比赛-编程之家

每类图像分布

为了更好地理解数据,将图像视觉化变得重要了。 因此,让我们来展示各类别的部分样本,看看图像的不同。

kaggle大数据竞赛(kaggle分类比赛-编程之家

所有的图像看起来都差不多,很少有从上面的图像群得到的。 因此,我决定使用被称为t分布随机邻域嵌入(t. SNE )的可视化技术来观察图像分布。

t分布随机邻域嵌入(t. SNE )是一种特别适合于高维数据集的可视化降维技术。 该技术可以通过牢固的皮卡丘近似模型实现,适用于现实世界的大规模数据集。 十四

kaggle大数据竞赛(kaggle分类比赛-编程之家

数据集的叔信号可视化

如果仔细观察,我们几乎看不出各种不同。 因此,掌握这些数据是只对人类来说难以理解,还是对机器学习模式来说也很重要。 因此,我们制定那个的基本基准。

培训和验证集

在开始模型基线之前,必须将数据划分为培训数据和验证数据集,并且在测试原始测试集之前,验证集必须充当测试数据集。 因此,模型基本上通过训练数据集进行实验,通过验证集进行测试,然后模型随着集合的多次验证而得到改进。 如果对验证集的结果满意,可以将模型应用于实际测试数据。 这里可以看到模型在验证集中是超拟合或非拟合的。 这有助于更好地调整模型。

通过保留80%的图像作为培训数据集,保留20%的图像作为验证集,划分了4750个图像的数据集。

kaggle大数据竞赛(kaggle分类比赛-编程之家

数据分割的训练和验证

步骤2 :

获得培训集和验证集后,从数据集基准开始。 这是在测试集中构建的分类问题,必须将测试集中的每个实例分类为第12类中的一个。 所以我们使用卷积神经网络(CNN )来完成这个任务。

创建CNN模型有很多方法,但是作为初学者,建议使用Keras深度学习库。 此外,还将使用由Keras提供的预培训模型,该模型在ImageNet数据集上经过培训,并且可以通过测试

微调这些模型以用于我们这里的任务。

从头开始去训练卷积神经网络实际上是非常低效的。所以,我们采用在有着 1000 类的 ImageNet 数据集上预训练过的 CNN 模型参数,并且在微调时,我们固定住一些层的参数,其他层的参数继续在我们这里的数据集上继续训练。这样做的原因是因为比较前面的一些层是用来学习图像的基本特征的,我们没有必要去训练并且可以直接在我们的任务里直接采用。一个值得我们注意的重要事情是,我们要去检查我们这里的数据集跟 ImageNet 相似性如何以及有多大。这两个数据集的特性决定了我们该如何进行网络微调。想要获取关于网络微调的详细资料,请参考 Andrej Karpathy的博客:

对于我们这里的例子,数据集是很小的,并且还跟 ImageNet 有点相似。所以我们首先直接用 ImageNet 上的权重,并加上有着 12 个类别的最终输出层来构建我们的第一个基准程序。接着,我们去把一些后面的层给「松开」并只训练这些层。

因为 Keras 提供很多的预训练模型,我们将用 Keras 去完成我们dldbb基准程序,我们将在我们的任务上用 ResNet50 和 InceptionResNetV2 这两个模型。为了理解在给定模型下,我们是过拟合还是欠拟合数据集,为数据集准备一个简单模型和一个复杂模型作为基准是非常重要的。

kaggle大数据竞赛(kaggle分类比赛-编程之家

我们也可以检查这些模型在 ImageNet 数据集上的性能或者这里的每一个模型的参数数量来选择我们的基准模型。

kaggle大数据竞赛(kaggle分类比赛-编程之家

对于第一个基准模型,我去掉了最后的输出层,并且只增加了对应着 12 个类别的输出层。模型总结贴在这里了,我们可以看到参数量,接着是最后几个层的截屏。

kaggle大数据竞赛(kaggle分类比赛-编程之家

我们加了一个稠密的层来得到第一个基准

模型总共训练了 10 轮,6 轮以后结果饱和了。训练集上的准确度达到了 88%,验证集上也有 87% 的准确度。

为了提高性能,一些前面的层被「松开」,我们以一个指数下降的学习率去训练这些层。这个可以进一步得到 2% 的提升。

训练一些前面的层的结果

这个过程中使用到的一些超参数:

kaggle大数据竞赛(kaggle分类比赛-编程之家

步骤 3:

在具备相关知识的基础下,我们可以尝试着增加图像数据的数量以改进上述模型。

没有数据,就没有机器学习!

但需要注意的是我们所拥有的数据往往存在数据类别不平衡的情况。我们首先应该处理这一问题,从而使得模型的每批样本即便拥有少量图像数据,也能达到较好的分类效果。

现实生活中的数据集很少能够达到数据平衡,而且模型对少数类样本的分类效果并不好。错误地分类一个少数类样本往往比错误分类一个正常数量样本会付出更大的代价。

我们可以用以下两种算法来解决数据不平衡问题:

1. 不均衡学习的自适应合成抽样算法(ADASYN):ADASYN 通过更多地合成更难学习的数据集,从而为少数类样本合成更多数据。

ADASYN 算法的基本思想是根据数据的学习难度,对不同的少数类样本进行加权分布。相比那些容易学习的少数类样本,为那些更难学习的少数类样本合成更多的数据。因此,ADASYN 算法通过以下两种方式来改善数据:1)减少类不平衡引起的偏差,2)自适应地将分类决策边界转向学习困难的样本。[5]

2. 合成少数类过采样算法 (SMOTE):SMOTE 通过对少数类的过度采样和对多数类的采样,从而获得最佳结果。

相比于对多数类样本进行欠采样,通过把对少数(异常)类样本进行过采样和对多数(正常)类进行采样相结合的方式,从而实现更好的分类效果(在 ROC 空间中)。[6]

kaggle大数据竞赛(kaggle分类比赛-编程之家

针对这个实例,SMOTE 算法相比 ADASYN 算法表现得更加出色。一旦数据达到平衡,我们便可以把这些数据用于数据集的扩充。

另外有一些数据增强方法,其中比较重要的有:

缩放

裁剪

翻转

回转

翻译

增加噪声

改变照明条件

像 GAN 这样的先进技术

现在已经有一些非常好的博客可以解释以上所有技巧。[8] [9] 因此这里不再细述。这里用到了上面提到的除 GAN 之外的所有数据增强技术。

步骤 4:

……

想要继续阅读,请移步至我们的AI研习社社区:https://club.leiphone.com/page/TextTranslation/618

更多精彩内容尽在 AI 研习社。

不同领域包括计算机视觉,语音语义,区块链,自动驾驶,数据挖掘,智能控制,编程语言等每日更新。

手机端可以扫描二维码访问:

雷锋网雷锋网