新加坡联合早报中文网即时报道亚洲和国际的评论、商业、体育、生活、科技与多媒体新闻,从世界各个维度报道世界经济新闻,时政新闻,突发新闻等。

当前位置:主页 > 新闻 > 用 Kaggle 经典案例教你用 CNN 做图像分类!

用 Kaggle 经典案例教你用 CNN 做图像分类!

来源:联合早报中文网作者:邵湖心更新时间:2020-09-05 17:52:02阅读:

本篇文章3000字,读完约8分钟

据雷锋说。这篇文章的原作者是田,原文载于作者的智湖专栏《机器不学习》和《雷锋》。(公开号码:雷锋。com)被授权发布。在最后一栏中,我们用卷积自编码器对mnist数据进行了实验。本周,我们在kaggle上观看了一场经典的图像分类比赛cifar(cifar-10-图像中的物体识别)。这种竞争现在已经结束了,但它并不妨碍我们通过它来学习用于图像识别的卷积神经网络的编码结构。我相信很多学习过深度学习的学生都尝试过这个比赛。如果他们熟悉它,他们可以跳过这一个。如果他们没有尝试过,他们可以学习它。

用 Kaggle 经典案例教你用 CNN 做图像分类!

整个代码已经放在我的github上了,所以建议在阅读文章的时候把代码拉下来阅读。

Github地址:尼尔森赵/胡志

~如果你觉得有帮助,请点一颗星星~

引言文章主要分为两个部分。在第一部分,我们将使用一个简单的knn来分类图像。在第二部分,我们将使用卷积神经网络来提高整个图像分类的性能。

第一部分是图像分类。我们可以想到传统机器学习中的knn算法。通过寻找当前待分类图像的K个邻居,我们可以通过邻居的类别来判断当前图像的类别。

由于我们的图像实际上是由一个像素组成的,所以每个图像都可以被视为一个矢量,所以我们可以计算此时矢量(图片)之间的距离。例如,如果我们的图片是32×32像素,它可以被扩展成1×1024的向量,并且可以计算这些向量之间的l1或l2距离,并且可以找到它们的邻居,从而根据邻居的类别来判断图像的类别。

用 Kaggle 经典案例教你用 CNN 做图像分类!

在以下示例中,k=5。

接下来,我们将使用scikit-learn实现以下knn图像分类。

首先,我们需要下载位于cs.toronto.edu/~kriz/cifar-10-python.tar.gz.的数据文件。我们的数据包括6亿张图片,每张图片的尺寸为32 x 32 x 3。这些图片有自己的标签,分为以下十类:

飞机

汽车

鹿

青蛙

卡车

数据在序列化后被存储,所以我们需要使用python中的pickle包来读入它们。整个压缩包解压缩后,将有五个数据批次和一个测试批次。让我们先加载数据:

我们定义了一个函数来批量获取特征和标签。通过以上步骤,我们可以得到列车数据和测试数据。

我们每张图片的尺寸是32 x 32 x 3,其中3代表rgb。让我们先看看这些图片是什么样子的。

每张图片的像素实际上非常低。缩小后,我们可以看到图中有汽车、马、飞机等等。

在构造了x_train、y_train、x_test和y_test之后,我们就可以开始建模过程了。在将图片放入模型之前,我们首先对数据进行预处理,包括整形和规范化。首先,我们将32 x 32 x 3转换为3072维向量,然后对数据进行归一化。标准化的目的是确保在计算距离时每个维度的维度是一致的。

用 Kaggle 经典案例教你用 CNN 做图像分类!

到目前为止,我们已经对数据进行了预处理。现在我们可以打电话给knn进行培训了。我用k = 1,3和5来看模型的效果。

从knn的分类准确率来看,它远远高于我们的随机猜测范畴。当我们随机猜测图片的类别时,准确率约为10%,而knn分类可以将准确率提高到35%左右。当然,感兴趣的伙伴也可以测试其他k值。在上述算法中,默认的距离测量方法是欧氏距离,其他距离测量可以尝试建模。

用 Kaggle 经典案例教你用 CNN 做图像分类!

虽然knn在测试数据集上的性能有所提高,但准确率仍然太低。此外,knn还有一个缺点,即所有的计算时间都在预测阶段,当一个新的图形出现时,它涉及到大量的距离计算,这意味着一旦我们使用它进行图像识别,可能需要很长时间才能得到结果,而且它不是那么准确。

用 Kaggle 经典案例教你用 CNN 做图像分类!

第二部分,我们用非常简单的knn思想来实现图像分类。在这一部分中,我们将通过卷积神经网络来实现一个更加精确和高效的模型。

加载数据的过程与前一部分相同,因此不再赘述。当我们完成数据加载时,我们必须首先做以下三件事:

标准化输入数据

标签的一次性编码

构建训练集、验证集和测试集

标准化输入数据

在这里,我们在sklearn中使用最小最大归一化。

首先,训练数据集被重新整形为[50000,3072]的形状,并通过最小最大值进行归一化。最后,图像被重塑为其原始形状。

标签的一次性编码

同样,我们使用sklearn中的labelbinarizer对one-hot进行编码。

构建训练和评价

目前,我们已经有了训练和测试的数据集。接下来,我们将加载的训练分为训练集和验证集。以便在训练过程中观察验证集的结果。

我们根据8: 2将训练数据集分为训练和验证。

卷积网络

在对数据进行预处理之后,我们接下来将开始建模。

首先,我们设置一些重要的参数,并构造输入和标记张量。

Img_shape是整个训练集的形状,即[40000,32,32,3]。同时,我们的输入形状是[批量大小,32,32,3]。因为我们已经将标签编码为一个热标签,所以标签是[batch_size,10]的张量。

接下来,让我们先看看整个卷积网络的结构:

这里我设置了两层卷积+两层全连接层的结构,你可以尝试其他不同的结构和参数。

在conv2d中,我将初始化权重定义为截尾正态,并证明了权重初始化对卷积结果有一定的影响。这里,我们来谈谈conv2d的参数:

输入时态:输入\u

过滤器数量:64

默认情况下,过滤器大小:高度= 2,宽度= 2,深度与输入深度相同

步幅:步幅默认为1x1,所以我没有在这里重置步幅

填充:填充我选择了相同的。当步长为1时,卷积后的高度和宽度与原始图像一致

内核初始化器:过滤器的初始化权重

这里我们讨论卷积函数中两种常用的填充方法,它们是有效的,也是相同的。假设输入图像的长度和宽度都是h,滤波器的大小是k×k,步长是s×s,填充大小是p。当填充=有效时,卷积图像的新长度(或宽度)是;当填充=相同时,卷积后。然而,张量流中的实现与这里的不同。在张量流中,当填充=有效时;当填充=相同时,。其他参数类似,因此在此不再重复。如果你不清楚,你可以查看官方文件。

用 Kaggle 经典案例教你用 CNN 做图像分类!

在第一个完全连接的层中,我增加了脱落正则化,以防止过度拟合和加速训练。

培训模式

建立模型后,让我们开始训练整个模型。

在培训过程中,日志每100轮打印一次,显示当前列车损失和验证的准确性。

让我们看看最终的培训结果:

上图是我之前跑步的结果。该运行可能不同,但准确度将在65%和70%之间。最后,验证的准确度稳定在70%左右。让我们看看测试数据的准确性。以下代码是测试中测试准确性的代码。

我们加载训练结果,并将测试的批次大小设置为100,以测试我们的训练结果。最终,我们测试的准确率约为70%。

综上所述,我们实现了两种图像分类算法。第一个是knn,它的思想很容易理解,但是它的缺点是计算量集中在测试阶段,而训练阶段的计算量几乎为零,另外它的准确性很差。其次,我们使用cnn实现分类,最终测试结果约为70%。与knn的30%准确率相比,其分类效果相当好。当然,如果你想继续提高模型的准确性,你需要使用一些其他的手段。如果感兴趣的伙伴可以查看相关链接中的技能(rodrigob。github.io/are _我们_那里_尚未/建立/分类_数据集_结果# 43494641522d3130),卡格尔的准确性一直位居第一

用 Kaggle 经典案例教你用 CNN 做图像分类!

如果你觉得有用,请记得给github一颗星,非常感谢!

雷锋文章版权所有。严禁擅自转载。详情请参考转载说明。

标题:用 Kaggle 经典案例教你用 CNN 做图像分类!

地址:http://www.6st8.com/zbxw/6108.html

免责声明:联合早报中文网从世界各个维度报道世界经济新闻,时政新闻,突发新闻等,本篇的部分内容来自于网络,不为其真实性负责,只为传播网络信息为目的,非商业用途,如有异议请及时联系btr2018@163.com,联合早报中文网的小编将予以删除。

返回顶部