雷锋网按:本文为AI研习社编译的技术博客,原标题 Kaggle #1 Winning Approach for Image Classification Challenge,作者为 Kumar Shridhar 。
翻译 | 京鹏 张小恬 蒋华烈 程磊 校对 | 余杭 整理 | MY
植物幼苗分类比赛冠军
这篇文章记录了我参加 Kaggle 植物幼苗分类比赛所采用的方法。我曾连续几个月占据榜首,并最终名列第五。这些方法通用性很好,可以应用到其他的图片分类任务中。
Kaggle 是一个预测建模和分析竞赛的平台,在这里,统计人员和数据挖掘者参与竞争,以产生预测和描述公司和用户上传数据集的最佳模型。这种众包的方式依赖于这样一个事实,即有无数的策略可用于任何预测性建模任务,并且事先不可能知道哪种技术或分析最有效。[1]
任务概览
你能从作物幼苗中区分出杂草吗?
有效的解决方案意味着更好的作物产量及更好的环境管理。
奥胡斯大学信号处理组与丹麦南方大学合作,发布了一个数据集,其中包含不同生长阶段的 12 个种类大约 960 种植物的图像 [1] [2]。
植物样本之一:繁缕 [3]
上述图像数据库已公开发布。它包含带注释的 RGB 图像,分辨率约为每毫米 10 个像素。
采用基于 F1 分数的指标对分类结果进行评估。数据集链接在 URL 里 [13]
以下图像是描述数据集中所有 12 个类的示例:
图片分类任务包含以下5个步骤:
步骤 1:
机器学习中的首要任务是分析数据集,然后才能进行任意算法。为了解数据集的复杂性,这一步很重要,这最终将有助于该算法设计。
图像和类的分布如下:
如上所述,此包含 12 个类共 4750 个图像。但是,以上可以看出,各类值分布不平均,图像类数值分布从最大 654 张到最小的 221 幅不等。这清楚地表明数据是不平均的,但为获得最好的结果我们需要权衡数据。步骤 3 中我们将达成此任务。
每类的图像分布
现在对图像进行可视化十分重要,以便能更好了解数据。因此,我们将展示每个类中的部分示例,查看图像的不同之处。
所有的图像看起来都相差无几,几乎没有什么内容可以从上面的图像群中获得。因此,我决定使用一个称为 t 分布随机邻域嵌入(t. SNE)的可视化技术观察图像分布。
t 分布随机邻域嵌入(t. SNE)是一种特别适合于高维数据集的可视化降维技术。该技术可以通过巴恩斯-小屋逼近模型实现,这允许该技术应用于现实世界的大型数据集。[14]
数据集的 t-SNE 可视化
在仔细观察后,我们几乎看不出各类间差异。所以,掌握是仅仅对人类而言这些数据是难以分辨的,还是对于机器学习模型同样如此十分重要。为此,我们将为它做一个基本的基准。
训练以及验证集合
在模型基准开始之前我们需要将数据划分为训练数据和验证数据集,对原始测试集进行测试之前验证集起到测试数据集作用。所以,模型基本上在训练数据集上进行实验,并在验证集上进行了测试,之后模型随着集合的多次验证得以改进。一旦我们对验证集的结果感到满意,就可将模型应用于实际测试数据。我们能够以此看到模型在我们的验证集上为超拟合或是欠拟合,这可以帮助我们更好地调整模型。
我们通过保持 80% 图像作为训练数据集及 20% 作为验证集来划分 4750 图像的数据集。
训练和验证数据拆分
步骤 2:
一旦我们得到了训练集和验证集,我们就从数据集的基准开始着手。这是一个建立在测试集上的一个分类问题,我们需要把测试集中的每一个实例划分为 12 类中的一类。所以我们将会用一个卷积神经网络(CNN)去完成这个任务。
有很多途径去创建一个 CNN 模型, 但是作为初学者, 我们最好使用 Keras 深度学习库. 我们也将使用 Keras 上提供的预训练模型, 这些模型是在 ImageNet 数据集上训练过的并且我们可以通过微调这些模型以用于我们这里的任务。
从头开始去训练卷积神经网络实际上是非常低效的。所以,我们采用在有着 1000 类的 ImageNet 数据集上预训练过的 CNN 模型参数,并且在微调时,我们固定住一些层的参数,其他层的参数继续在我们这里的数据集上继续训练。这样做的原因是因为比较前面的一些层是用来学习图像的基本特征的,我们没有必要去训练并且可以直接在我们的任务里直接采用。一个值得我们注意的重要事情是,我们要去检查我们这里的数据集跟 ImageNet 相似性如何以及有多大。这两个数据集的特性决定了我们该如何进行网络微调。想要获取关于网络微调的详细资料,请参考 Andrej Karpathy 的博客:
对于我们这里的例子,数据集是很小的,并且还跟 ImageNet 有点相似。所以我们首先直接用 ImageNet 上的权重,并加上有着 12 个类别的最终输出层来构建我们的第一个基准程序。接着,我们去把一些后面的层给「松开」并只训练这些层。
因为 Keras 提供很多的预训练模型,我们将用 Keras 去完成我们最初基准程序,我们将在我们的任务上用 ResNet50 和 InceptionResNetV2 这两个模型。为了理解在给定模型下,我们是过拟合还是欠拟合数据集,为数据集准备一个简单模型和一个复杂模型作为基准是非常重要的。
我们也可以检查这些模型在 ImageNet 数据集上的性能或者这里的每一个模型的参数数量来选择我们的基准模型。
对于第一个基准模型,我去掉了最后的输出层,并且只增加了对应着 12 个类别的输出层。模型总结贴在这里了,我们可以看到参数量,接着是最后几个层的截屏。
我们加了一个稠密的层来得到第一个基准
模型总共训练了 10 轮,6 轮以后结果饱和了。训练集上的准确度达到了 88%,验证集上也有 87% 的准确度。
为了提高性能,一些前面的层被「松开」,我们以一个指数下降的学习率去训练这些层。这个可以进一步得到 2% 的提升。
训练一些前面的层的结果
这个过程中使用到的一些超参数:
步骤 3:
在具备相关知识的基础下,我们可以尝试着增加图像数据的数量以改进上述模型。
没有数据,就没有机器学习!
但需要注意的是我们所拥有的数据往往存在数据类别不平衡的情况。我们首先应该处理这一问题,从而使得模型的每批样本即便拥有少量图像数据,也能达到较好的分类效果。
现实生活中的数据集很少能够达到数据平衡,而且模型对少数类样本的分类效果并不好。错误地分类一个少数类样本往往比错误分类一个正常数量样本会付出更大的代价。
我们可以用以下两种算法来解决数据不平衡问题:
1. 不均衡学习的自适应合成抽样算法(ADASYN):ADASYN 通过更多地合成更难学习的数据集,从而为少数类样本合成更多数据。
ADASYN 算法的基本思想是根据数据的学习难度,对不同的少数类样本进行加权分布。相比那些容易学习的少数类样本,为那些更难学习的少数类样本合成更多的数据。因此,ADASYN 算法通过以下两种方式来改善数据:1)减少类不平衡引起的偏差,2)自适应地将分类决策边界转向学习困难的样本。[5]
2. 合成少数类过采样算法 (SMOTE):SMOTE 通过对少数类的过度采样和对多数类的采样,从而获得最佳结果。
相比于对多数类样本进行欠采样,通过把对少数(异常)类样本进行过采样和对多数(正常)类进行采样相结合的方式,从而实现更好的分类效果(在 ROC 空间中)。[6]
针对这个实例,SMOTE 算法相比 ADASYN 算法表现得更加出色。一旦数据达到平衡,我们便可以把这些数据用于数据集的扩充。
另外有一些数据增强方法,其中比较重要的有:
-
缩放
-
裁剪
-
翻转
-
回转
-
翻译
-
增加噪声
-
改变照明条件
-
像 GAN 这样的先进技术
现在已经有一些非常好的博客可以解释以上所有技巧。[8] [9] 因此这里不再细述。这里用到了上面提到的除 GAN 之外的所有数据增强技术。
步骤 4:
……
想要继续阅读,请移步至我们的AI研习社社区:https://club.leiphone.com/page/TextTranslation/618
更多精彩内容尽在 AI 研习社。
不同领域包括计算机视觉,语音语义,区块链,自动驾驶,数据挖掘,智能控制,编程语言等每日更新。
手机端可以扫描二维码访问:
雷锋网雷锋网(公众号:雷锋网)
。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/134306.html