众所周知,Kaggle 是一个进行预测建模及数据剖析的竞赛平台。在这个平台上,统计学家和数据科学家竞相构建最佳的模型,这些模型被用于预测、描述公司和用户上传的数据集。这种众包的办法之以是被广为接管,是由于对付同一个预测建模任务来说,可能存在无数种办理议方案略,但是想要事先知道哪种技能或剖析方法是最有效的险些不可能。[1]
任务概述
你能分清杂草和农作物幼苗吗?
如果我们能高效地区分农作物幼苗和杂草,那么就可以提升农作物的产量,更好地管理环境中的杂草。
Aarhus 大学旗子暗记处理研究小组与南丹麦大学互助,发布了一个用于该任务的数据包,个中包括处于不同成长阶段的 12 个物种(共计 960 栽种物)的图像。[1][2]
植物样本之一:「繁缕」样本
这个公开的数据库由注释的 RGB 图像组成,其物理分辨率大约为每毫米 10 像素。
为了对利用该数据库得到的分类结果进行标准化评估,组织者供应了基于 F1 值的比拟基准,你可以通过如下链接得到这个数据集:https://vision.eng.au.dk/plant-seedlings-dataset/。[13]
下图是一个表示了该数据集中 12 类植物的样本:
图片来源:https://vision.eng.au.dk/plant-seedlings-dataset/
下面为大家先容这一图像分类任务,该任务可以分为五个步骤第一步:
在大多数机器学习任务中,我们首先要做的(也是最主要的任务)便是在利用算法之前剖析数据集。这一步骤之以是主要,是由于它能够让我们对数据集的繁芜度有深入的理解,这终极将有助于算法的设计。
图像和类别的分布情形如下:
正如文中所提到的,该数据集共包含 4750 张从属于 12 个类别的植物图片。然而,如上图所示,这种分布是不屈均的,各种类别的植物分布从最多 654 张图像到最少 221 张图像。很显然数据是不平衡的,我们须要对数据进行平衡处理,以便得到最佳的分类效果。本文将在第三步中谈论这个问题。
每个类的图像分布
为了更好地理解数据,对图像进行可视化处理十分主要。因此,我们将每类植物的示例图片展示了出来,以便看到图像之间的差异。
上面这些图片看上去实在太像了,以至于我们不能直接看出什么信息。因此,我决定利用 t 分布随机邻域嵌入(https://lvdmaaten.github.io/tsne/)可视化技能来查看图片的分布。
t 分布随机邻域嵌入(t—SNE)是一种特殊适宜对高维数据集进行可视化的降维技能。这种技能可以通过「Barnes-Hut」近似算法来实现,这使得它能够被运用于大型的真实数据集。[14]
数据集的t-SNE可视化结果
仔细不雅观察之后,我们险些看不出种别之间的差异。因此,知道仅仅是人类难以区分这个数据,还是机器学习模型也很难区分这个数据很主要。以是,我们将为此做一个基本的比拟基准。
演习集和验证集
在开始建立模型的比拟基准前,我们须要将数据划分为演习数据集和验证数据集。在原始测试集上测试模型之前,验证集起到了测试数据集的浸染。以是,一个模型基本上是在演习数据集上进行演习,在验证集上进行测试,随着韶光的推移,模型在验证集上的性能将会提升。
一旦我们对验证集上的测试结果感到满意,我们就可以在真实的测试集上运用该模型。通过这种办法,可以看出模型是否在验证集上发生欠拟合或过拟合征象,这可以帮助我们更好地拟合模型。
我们将包含 4750 张图片的数据集的 80% 作为演习集,其余 20% 作为验证集。
演习集和验证集的划分
第二步:
当得到了演习集和验证集之后,我们将开始利用数据集的比拟基准。正如所见,这是一个分类问题:给定测试集,我们须要将图片归类到 12 个种别中的某一类。我们将利用卷积神经网络(CNN)来完成这项任务。
「如果你是一位初学者,须要对深度学习术语有更深的理解,请访问如下博客:https://medium.com/@shridhar743/a-beginners-guide-to-deep-learning-5ee814cf7706」
事实上,有许多方法可以创建卷积神经网络(CNN)模型,我们将利用 Keras 深度学习程序库来实现第一个比拟基准。我们还将利用 Keras 中供应的预演习好的模型,这些模型已经利用 ImageNet 数据集演习过,我们将对其进行调优以知足任务需求。
从头开始演习一个卷积神经网络(CNN)的效率相称低下,我们将利用在包含 1000 类图像的 ImageNet 上预演习好的卷积神经网络(CNN)的权重,然后通过将某些层保持为「冻结」状态,再将一些层解冻并进行演习,从而进行调优。这是由于,最上面的层学习到大略的基本特色,而我们不须要对其进行演习,可以直接将它们运用到我们的任务中。须要把稳的一点是,我们要检讨数据集是否与 ImageNet 类似,以及我们的数据集规模有多大。这两个特色将决定我们如何进行调优。如果你想理解更多的细节,请参阅 Andrej Karpathy 的博客(https://medium.com/@karpathy)。
在植物幼苗检测比赛的环境下,数据集规模很小,但是与 ImageNet 有些相似之处。因此,我们可以首先直策应用 ImageNet 的权重,仅仅在比拟基准的根本上添加一个能够对 12 个类进行分类的终极输出层。接着,我们将逐渐解冻一些模型底部的层,并仅仅对这些解冻的层进行演习。
由于 Keras 库供应了大量预演习好的模型,我们采取 Keras 为比拟基准进行初始化。详细而言,我们将利用 ResNet50 和 InceptionResNetV2 这两个模型。很主要的是,我们须要用一个大略模型和一个非常高真个模型对数据集进行基准测试,以便创造给定模型是否产生了欠拟合和过拟合。
Keras 库供应的在 ImageNet 上预演习好的模型
图片来源:https://keras.io/applications/
此外,我们还可以检测这些模型在 ImageNet 数据集上的性能,查看 Keras 中每个模型(https://keras.io/applications/)的参数个数,从而选择比拟基准模型。
图片来源:https://keras.io/applications/
在第一个基准测试中,我删除了末了的输出层,并添加了一个能够对 12 个种别进行分类的终极输出层。此外,我将总结出的模型运行结果和参数的个数打印了出来,下图是末了几层网络的信息截图:
我在模型的末了添加了一个全连接层,构建了第一个比拟基准
我共将该模型运行了 10 轮,而实验结果在第 6 轮之后就饱和了。演习的准确率为 88%,验证的准确率则为87%。
为了进一步提升模型的性能,我们解冻了一些模型底部的层,并且令其学习率呈指数形式递减,像这样,我们演习了更多的层。这个操作使模型性能提高了 2%。
演习了模型底部几层之后得到的实验结果
此外,在这个过程中,我们利用的超参数总结如下:
第三步:
一旦准备好了比拟基准,我们就须要开始对其进行改进。首先,我们可以进行数据增强处理,增加数据集中的图像数。
没有数据,就没有机器学习!
但是正如上文所述,我们得到的数据集是不平衡的,我们须要对其进行平衡化处理,从而利用于演习模型的每一批的数据中都有均匀分布的 12 类图像。
现实生活中的数据集每每都是不平衡的,而模型在样本数量较少的种别上的性能并不太好。以是,将一个具有少数样本的类误分类为一个样本数量较多的类的本钱常日要比将数量较多的类误分类高得多。
由此,我们考试测验利用两种方法来平衡数据:
针对不平衡学习的自适应样本合成方法(ADASYN):ADASYN 为样本较少的类天生合成的数据,这种方法会天生更多较难学习的数据集样本。
ADASYN 的核心思想是,根据学习的困难程度,对样本数少的种别实例利用加权分布。ADASYN 通过两种方法提高了对数据分布的学习效果:(1)减少类别的不平衡所带来的偏差。(2)自适应地将分类的决策边界转换为更困难的样本。[5]
少数类过采样技能(SMOTE):SMOTE 包括对少数类的过采样和多数类的欠采样,从而得到最佳抽样结果。
我们对少数(非常)类进行过采样并对多数(正常)类进行欠采样的做法可以得到比仅仅对多数类进行欠采样更好的分类性能(在 ROC 空间中)。[6]
重抽样结果示意图[7]
在此用例中,可以证明 SMOTE 算法的结果更好,因此 SMOTE 的性能优于 ADASYN 算法。当数据集处于平衡状态后,我们就可以连续进行数据增强事情。
我们可以通过许多路子实现数据增强,个中最主要的一些方法如下:
缩放
裁剪
反转
旋转
平移
加入噪音
改变光照条件
利用 GAN 这样的前辈技能
第四步:接下来,我们将进一步提升模型结果。在这里,我们将对学习率进行优化,这里涉及到周期性学习率(cyclical learning rate)和带热重启的学习率(learning rate with warm restarts)技能。在此之前,我们须要为模型找到可能的最佳学习率。这是通过绘制学习率和丢失函数的关系图来实现的,这一图像用来查看丢失函数值从哪里开始低落。
本文描述了一种设定学习率的新方法——周期性学习率,它实际上让我们不必再通过大量实验找到全局学习率的最优值和最佳学习操持。这种方法并不是单调地减小学习率,而是让学习率周期性地在合理的边界值之间变革。利用周期性学习率代替固定的学习率进行演习,能够有效地在不用进行调优的情形下提升分类准确率,须要的迭代次数每每也更少。[11]
学习率和丢失函数的关系示意图
如上图所示,0.1 看上去彷佛是一个不错的学习率。但是随着越来越靠近全局最小值,我们希望用更小的步长对最佳学习率进行探索。「学习率退火」是一种实现这种操作的方法,受到这篇论文(https://arxiv.org/pdf/1608.03983.pdf)的影响,我选择利用带热重启的学习率。同时,我们将优化器从 Adam 变为随机梯度低落(SGD),实现了带重启策略的随机梯度低落(SGDR)。
接下来,我们可以利用上述技能演习一些模型架构,然后将这些模型得到的结果进行合并。这也便是所谓的模型集成,如今它已经成为一种盛行技能,但是这种技能也将带来高昂的打算开销。
因此,我决定利用一种名为快照集成(snapshot ensembling)的技能,通过演习一个单一神经网络来达到集成目的,并且沿着优化路径收敛到几个局部最小值,终极将模型参数保存下来。
左图:利用传统学习率操持的随机梯度低落优化示意图。在演习结束时,模型收敛到一个最小值处。
右图:快照集成示意图。模型经历了几个学习率退火周期,在从多个局部最小值中逃离出来后,收敛到某最小值处。我们为测试时集成的每一个最小值建立了一个快照。
图片来源:https://arxiv.org/abs/1704.00109
当学习率被固定下来后,我开始调度图像的大小。我演习了一个针对付 6464 图像大小的模型(在 ImageNet 上对其进行调优),解冻某些层,对其运用周期性学习率和快照集成技能,得到该模型的权重。将图像的尺寸改为 299299,并且再次利用图像大小为 6464 的权重对其进行调优,并采取快照集成技能和带热重启的学习率。
如果改变图像的大小,须要再次采取周期性学习率、快照集成、热重启等技能探求学习率和丢失函数之间的关系,得到最佳学习率。
第五步:
在末了一步,我们将对结果进行可视化,看看模型对哪个类别的预测结果最好、对哪个类别的预测结果最差,并且我们还可以采纳必要的方法进一步改进结果。
布局一个稠浊矩阵是理解模型结果的好方法。
在机器学习领域,特殊是统计分类问题中,稠浊矩阵(也称为偏差矩阵)是一个特定的表格,它能够将算法的性能可视化,这种算法常日是监督学习算法,在非监督学习领域它常日被称为匹配矩阵。矩阵中的每一行代表预测种别中的一个实例,而每一列则代表真实种别中的一个实例(反之亦然)。这个矩阵之以是被称为「稠浊矩阵」,是由于它能够让人很随意马虎地看到系统是否稠浊了两个类(即常日将一个类缺点标记为另一个类)。
稠浊矩阵中真正的种别和预测出的种别
从稠浊矩阵中我们可以看到所有的模型预测种别和真实种别不符的情形,我们可以采纳方法去改进模型。例如,可以做更多的数据增强事情,试着让模型更好地学习到分类规则。
末了,我们将验证集与演习数据合并,并通过已经得到的超参数,对模型进行末了一次演习,在终极提交结果之前对测试数据集进行评估。
本文模型在终极提交后名列第一
请把稳:演习中利用的数据增强结果须要在测试集中显示出来,以得到可能得到的最佳结果。雷锋网
参考文献:
[1] https://www.kaggle.com/c/plant-seedlings-classification
[2] https://arxiv.org/abs/1711.05458
[3] https://vision.eng.au.dk/plant-seedlings-dataset/
[4] https://keras.io/applications/
[5] https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=4633969&tag=1
[6] https://jair.org/index.php/jair/article/view/10302
[7] http://contrib.scikit-learn.org/imbalanced-learn/stable/auto_examples/over-sampling/plot_comparison_over_sampling.html#sphx-glr-auto-examples-over-sampling-plot-comparison-over-sampling-py
[8]https://medium.com/nanonets/how-to-use-deep-learning-when-you-have-limited-data-part-2-data-augmentation-c26971dc8ced
[9]https://medium.com/ymedialabs-innovation/data-augmentation-techniques-in-cnn-using-tensorflow-371ae43d5be9
[10] https://arxiv.org/pdf/1608.03983.pdf
[11] https://arxiv.org/pdf/1506.01186.pdf
[12] https://arxiv.org/abs/1704.00109
[13]https://vision.eng.au.dk/plant-seedlings-dataset/
[14] https://lvdmaaten.github.io/tsne/