图像分类比赛[举一反三]

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/as472780551/article/details/83573176

https://mp.weixin.qq.com/s/7XALdbcz3imCs2kbmEI-lQ

用心去思考一些东西,相信自己可以做到的

下面为大家介绍这一图像分类任务,该任务可以分为五个步骤

第一步:

在大多数机器学习任务中,我们首先要做的(也是最重要的任务)就是在使用算法之前分析数据集。这一步骤之所以重要,是因为它能够让我们对数据集的复杂度有深入的了解,这最终将有助于算法的设计。

正如文中所提到的,该数据集共包含 4750 张从属于 12 个类别的植物图片。然而,如上图所示,这种分布是不均匀的,各种类别的植物分布从最多 654 张图像到最少 221 张图像。很显然数据是不平衡的,我们需要对数据进行平衡处理,以便获得最佳的分类效果。本文将在第三步中讨论这个问题。

数据集的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 这两个模型。很重要的是,我们需要用一个简单模型和一个非常高端的模型对数据集进行基准测试,以便发现给定模型是否产生了欠拟合和过拟合。

此外,我们还可以检测这些模型在 ImageNet 数据集上的性能,查看 Keras 中每个模型(https://keras.io/applications/)的参数个数,从而选择对比基准模型。

我在模型的最后添加了一个全连接层,构建了第一个对比基准

我共将该模型运行了 10 轮,而实验结果在第 6 轮之后就饱和了。训练的准确率为 88%,验证的准确率则为87%。

第三步:

一旦准备好了对比基准,我们就需要开始对其进行改进。首先,我们可以进行数据增强处理,增加数据集中的图像数。

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

但是正如上文所述,我们得到的数据集是不平衡的,我们需要对其进行平衡化处理,从而使用于训练模型的每一批的数据中都有均匀分布的 12 类图像。

现实生活中的数据集往往都是不平衡的,而模型在样本数量较少的类别上的性能并不太好。所以,将一个具有少数样本的类误分类为一个样本数量较多的类的成本通常要比将数量较多的类误分类高得多。

在此用例中,可以证明 SMOTE 算法的结果更好,因此 SMOTE 的性能优于 ADASYN 算法。当数据集处于平衡状态后,我们就可以继续进行数据增强工作。

我们可以通过许多途径实现数据增强,其中最重要的一些方法如下

缩放

裁剪

反转

旋转

平移

加入噪音

改变光照条件

使用 GAN 这样的先进技术

学习率和损失函数的关系示意图

如上图所示,0.1 看上去似乎是一个不错的学习率。但是随着越来越接近全局最小值,我们希望用更小的步长对最佳学习率进行探索。「学习率退火」是一种实现这种操作的方法,受到这篇论文(https://arxiv.org/pdf/1608.03983.pdf)的影响,我选择使用带热重启的学习率。同时,我们将优化器从 Adam 变为随机梯度下降(SGD),实现了带重启策略的随机梯度下降(SGDR)。

接下来,我们可以使用上述技术训练一些模型架构,然后将这些模型得到的结果进行合并。这也就是所谓的模型集成,如今它已经成为一种流行技术,但是这种技术也将带来高昂的计算开销。 

因此,我决定使用一种名为快照集成(snapshot ensembling)的技术,通过训练一个单一神经网络来达到集成目的,并且沿着优化路径收敛到几个局部最小值,最终将模型参数保存下来。

当学习率被固定下来后,我开始调整图像的大小。我训练了一个针对于 64*64 图像大小的模型(在 ImageNet 上对其进行调优),解冻某些层,对其应用周期性学习率和快照集成技术,获得该模型的权重。将图像的尺寸改为 299*299,并且再次利用图像大小为 64*64 的权重对其进行调优,并采用快照集成技术和带热重启的学习率。

第五步:

在最后一步,我们将对结果进行可视化,看看模型对哪个类别的预测结果最好、对哪个类别的预测结果最差,并且我们还可以采取必要的措施进一步改进结果。

构造一个混淆矩阵是理解模型结果的好方法。

在机器学习领域,特别是统计分类问题中,混淆矩阵(也称为误差矩阵)是一个特定的表格,它能够将算法的性能可视化,这种算法通常是监督学习算法,在非监督学习领域它通常被称为匹配矩阵。矩阵中的每一行代表预测类别中的一个实例,而每一列则代表真实类别中的一个实例(反之亦然)。这个矩阵之所以被称为「混淆矩阵」,是因为它能够让人很容易地看到系统是否混淆了两个类(即通常将一个类错误标记为另一个类)。

猜你喜欢

转载自blog.csdn.net/as472780551/article/details/83573176