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

前言

在上一篇专栏中,我们利用卷积自编码器对 MNIST 数据进行了实验,这周我们来看一个 Kaggle 上比较经典的一个图像分类的比赛 CIFAR( CIFAR-10 - Object Recognition in Images ),这个比赛现在已经关闭了,但不妨碍我们来去通过它学习一下卷积神经网络做图像识别的代码结构。相信很多学过深度学习的同学都尝试过这个比赛,如果对此比较熟悉的可以跳过本篇,如果没有尝试过的同学可以来学习一下哈。

整个代码已经放在了我的 GitHub 上,建议可以把代码 pull 下来,边看文章边看代码。

GitHub 地址:NELSONZHAO/zhihu

如果觉得有帮助,麻烦点个 star 啦~

介绍

文章主要分为两个部分,第一部分我们将通过一个简单的 KNN 来实现图像的分类,第二部分我们通过卷积神经网络提升整个图像分类的性能。

第一部分

提到图像分类,我们可能会想到传统机器学习中 KNN 算法,通过找到当前待分类图像的 K 个近邻,以近邻的类别判断当前图像的类别。

由于我们的图像实际上是由一个一个像素组成的,因此每一个图像可以看做是一个向量,那么我们此时就可以来计算向量(图片)之间的距离。比如,我们的图片如果是 32x32 像素的,那么可以展开成一个 1x1024 的向量,就可以计算这些向量间的 L1 或者 L2 距离,找到它们的近邻,从而根据近邻的类别来判断图像的类别。

以下例子中 K=5。

下面我们就来用 scikit-learn 实现以下 KNN 对图像的分类。

首先我们需要下载数据文件,网址为 https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz 。我们数据包含了 60000 万图片,每张图片的维度为 32 x 32 x 3,这些图片都有各自的标注,一共分为了以下十类:

  • airplane
  • automobile
  • bird
  • cat
  • deer
  • dog
  • frog
  • horse
  • ship
  • truck

数据是被序列化以后存储的,因此我们需要使用 Python 中的 pickle 包将它们读进来。整个压缩包解压以后,会有 5 个 data_batch 和 1 个 test_batch。我们首先把数据加载进来:

我们定义了一个函数来获取 batch 中的 features 和 labels,通过上面的步骤,我们就可以获得 train 数据与 test 数据。

我们的每个图片的维度是 32 x 32 x 3,其中 3 代表 RGB。我们先来看一些这些图片长什么样子。

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

构造好了我们的 x_train, y_train, x_test 以及 y_test 以后,我们就可以开始建模过程。在将图片扔进模型之前,我们首先要对数据进行预处理,包括重塑和归一化两步,首先将 32 x 32 x 3 转化为一个 3072 维的向量,再对数据进行归一化,归一化的目的在于计算距离时保证各个维度的量纲一致。

到此为止,我们已经对数据进行了预处理,下面就可以调用 KNN 来进行训练,我分别采用了 K=1,3,5 来看模型的效果。

从 KNN 的分类准确率来看,是要比我们随机猜测类别提高了不少。我们随机猜测图片类别时,准确率大概是 10%,KNN 方式的图片分类可以将准确率提高到 35% 左右。当然有兴趣的小伙伴还可以去测试一下其他的 K 值,同时在上面的算法中,默认距离衡量方式是欧式距离,还可以尝试其他度量距离来进行建模。

虽然 KNN 在 test 数据集上表现有所提升,但是这个准确率还是太低了。除此之外,KNN 有一个缺点,就是所有的计算时间都在 predict 阶段,当一个新的图来的时候,涉及到大量的距离计算,这就意味着一旦我们要拿它来进行图像识别,那可能要等非常久才能拿到结果,而且还不是那么的准。

第二部分

在上一部分,我们用了非常简单的 KNN 思想实现了图像分类。在这个部分,我们将通过卷积神经网络来实现一个更加准确、高效的模型。

加载数据的过程与上一部分相同,不再赘述。当我们将数据加载完毕后,首先要做以下三件事:

  • 对输入数据归一化
  • 对标签进行 one-hot 编码
  • 构造训练集,验证集和测试集

对输入数据归一化

在这里我们使用 sklearn 中的 minmax 归一化。

首先将训练数据集重塑为 [50000, 3072] 的形状,利用 minmax 来进行归一化。最后再将图像重塑回原来的形状。

对标签进行 one-hot 编码

同样我们在这里使用 sklearn 中的 LabelBinarizer 来进行 one-hot 编码。

构造 train 和 val

目前我们已经有了 train 和 test 数据集,接下来我们要将加载进来的 train 分成训练集和验证集。从而在训练过程中观察验证集的结果。

我们将训练数据集按照 8:2 分为 train 和 validation。

卷积网络

完成了数据的预处理,我们接下来就要开始进行建模。

首先我们把一些重要的参数设置好,并且将输入和标签 tensor 构造好。

img_shape 是整个训练集的形状,为 [40000, 32, 32, 3],同时我们的输入形状是 [batch_size, 32, 32, 3],由于前面我们已经对标签进行了 one-hot 编码,因此标签是一个 [batch_size, 10] 的 tensor。

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

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

conv2d 中我自己定义了初始化权重为 truncated_normal,事实证明权重初始化对于卷积结果有一定的影响。

在这里,我们来说一下 conv2d 的参数:

  • 输入 tensor:inputs_
  • 滤波器的数量:64
  • 滤波器的 size:height=2, width=2, depth 默认与 inputs_的 depth 相同
  • strides:strides 默认为 1x1,因此在这里我没有重新设置 strides
  • padding:padding 我选了 same,在 strides 是 1 的情况下,经过卷积以后 height 和 width 与原图保持一致
  • kernel_initializer:滤波器的初始化权重

在这里讲一下卷积函数中的两种常见 padding 方式,分别是 valid,same。假设我们输入图片长和宽均为 h,filter 的 size 为 k x k,strides 为 s x s,padding 大小 = p。当 padding=valid 时,经过卷积以后的图片新的长(或宽)为  ;当 padding=same 时,经过卷积以后  。但在 TensorFlow 中的实现与这里有所区别,在 TensorFlow 中,当 padding=valid 时,  ;当 padding=same 时,  。

其余参数类似,这里不再赘述,如果还不是很清楚的小伙伴可以去查看官方文档。

在第一个全连接层中我加入了 dropout 正则化防止过拟合,同时加快训练速度。

训练模型

完成了模型的构建,下面我们就来开始训练整个模型。

在训练过程中,每 100 轮打印一次日志,显示出当前 train loss 和 validation 上的准确率。

我们来看一下最终的训练结果:

上图是我之前跑的一次结果,这次跑出来可能有所出入,但准确率大概会在 65%-70% 之间。

最后在 validation 上的准确率大约稳定在了 70% 左右,我们接下来看一下在 test 数据上的准确率。下面的代码是在 test 测试准确率的代码。

我们把训练结果加载进来,设置 test 的 batchs_size 为 100,来测试我们的训练结果。最终我们的测试准确率也基本在 70% 左右。

总结

至此,我们实现了两种图像分类的算法。第一种是 KNN,它的思想非常好理解,但缺点在于计算量都集中在测试阶段,训练阶段的计算量几乎为 0,另外,它的准确性也非常差。第二种我们利用 CNN 实现了分类,最终的测试结果大约在 70% 左右,相比 KNN 的 30% 准确率,它的分类效果表现的相当好。当然,如果想要继续提升模型的准确率,就需要采用其他的一些手段,如果感兴趣的小伙伴可以去看一下相关链接(http://rodrigob.github.io/are_we_there_yet/build/classification_datasets_results.html#43494641522d3130) 里的技巧,Kaggle 上的第一名准确率已经超过了 95%。

如果觉得有用,请记得给 GitHub 打一个 Star,非常感谢!

====================================分割线================================

本文作者:AI研习社

本文转自雷锋网禁止二次转载,原文链接

时间: 2025-01-19 12:22:19

用 Kaggle 经典案例教你用 CNN 做图像分类!的相关文章

经典案例教你无本生意如何创业赚钱!

核心提示: 钱在银行里,钱在别人的口袋里,这里就讲怎样利用别人口袋里的钱变成自己的资本为自己赚钱. 相信在坐的都想过要创业,或者已是在创业中,在你高喊我要创业的时候,我给你助威,然而喊过的现实是:创业资金为零,有多少英雄好汉都在这里退步不前,赚钱离不开资本,做生意不能没有本钱,然而钱在哪里? 给大家举几个小实例,是我本人现我身边发生的实实在在的创业故事,希望从这里大家都能得到启发. 第一例:无钱起楼房入住新房开店(二例):这是1998年的事了,我有一个同乡,穷到家里的破瓦房都不能加上一片新瓦片,

(zhuan) 资源|TensorFlow初学者必须了解的55个经典案例

资源|TensorFlow初学者必须了解的55个经典案例 2017-05-27 全球人工智能   >>>>>>欢迎投稿:news@top25.cn<<<<<< 文章来源:github      采编:lily   本文是TensorFlow实现流行机器学习算法的教程汇集,目标是让读者可以轻松通过清晰简明的案例深入了解 TensorFlow.这些案例适合那些想要实现一些 TensorFlow 案例的初学者.本教程包含还包含笔记和带有注解

CSS3学习资源:学习css3应用的经典案例

文章简介:20个网页设计师应该学习的CSS3经典教程实例. 设计师千万不要总觉得CSS3还离我们特别遥远,其实如果你有兴趣的话,完全可以学习了解一些简单的CSS3技术. 你知道的,国内的行情就是如此:所有的公司都会希望你在前端技术上懂的越多越好.那设计师学习前端代码是否就是天方夜谭呢?其实并不如此.就像我们学设计一样,最基本的方法就是模仿,以及观看大师作品的案例.所以,今天我们为您收集了20个基础教程,均是涉及到css3应用的经典案例,值得收藏学习. Smooth Diagonal Fade G

无线路由器故障经典案例追踪分析

在企业环境下部署无线网络,方便了企业内部的移动办公.而无线路由器则是无线网络的核心组件,它的运行状态决定了无线网络的传输能力.正因如此,维护无线路由器,使其安全高效地运行是管理员首先要考虑的问题. 下面列举几个无线路由器的经典案例,希望对大家有所帮助. 案例1:无法登录无线路由器的设置页面进行路由设置 原 因:排除硬件及其连接故障,主要是之前登陆时所创建的连接有误. 排除故障: 第一步:首先检查路由器与电脑的硬件无线连接情况,检查路由器LAN口上的指示灯是否正常. 第二步:如果计算机中装有防火墙

MySQL数据库上云四年打磨,五大经典案例让你不再“蓝瘦”

通过以往的经验分析得出,数据库上云问题可能有以下几种情况: 1.         数据库跨平台迁移(PG->MySQL.Oracle->MySQL),淘宝以前就有大量的Oracle迁到MySQL,也是发生过很多问题. 2.         跨版本升级(MySQL:5.1->5.5.5.5->5.6),导致了性能问题. 3.         数据库的执行计划.优化器.参数配置和硬件配置. 4.         云上较明显就是网络延迟(跨可用区域访问.公网延迟.网卡饱满).   应用场

【阿里在线技术峰会】罗龙九:云数据库十大经典案例分析

本文根据阿里云资深DBA专家罗龙九在首届阿里巴巴在线峰会的<云数据库十大经典案例分析>的分享整理而成.罗龙九以MySQL数据库为例,分析了自RDS成立至今,用户在使用RDS过程中最常见的问题,包括:索引.SQL优化.锁.延迟.参数优化.连接数.CPU.Iops.磁盘.内存等.罗龙九通过对十大经典案例的总结,还原问题原貌,给出分析问题的思路,旨在帮助用户在使用RDS的路上少一些弯路,多一些从容. 直播视频 (点击图片查看视频) 幻灯片下载:点此进入 以下为整理内容. 案例一:索引 今天之所以将索

数据库上云经典案例分析

本文PPT来自阿里云技术专家玄惭于10月14日在2016年杭州云栖大会上发表的演讲,分享主题为<数据库上云经典案例分析>. 玄惭花名出自<天龙八部>,2012年加入阿里云RDS并负责线上的稳定,历年RDS双11的负责人,目前负责RDS专家服务.在这次分享上,玄惭用五个经典案例与我们分享数据库上云中的经验与教训. 案例一中,某客户正在将本地的业务系统迁移上云,但在RDS上运行时间明显要比线下自建数据库运行时间要慢1倍,导致客户系统割接延期的风险.经过经验分析和测试验证后,发现参数配置

《不只是美:信息图表设计原理与经典案例》—— 1.1 理性乐观派观派

1.1 理性乐观派观派 不只是美:信息图表设计原理与经典案例 原本我打算在这章的开头讲述几个有关信息可视化.信息设计和信息图表的正式定义,但没有这样做,一些事情改变了我的想法.一次,我随意浏览<纽约时报>(The New York Times)网站时,一篇关于<理性乐观派:一部人类经济进步史>(The Rational Optimist: How Prospersity Evolves)(2010年)的评论引起了我的注意,该书的作者是英国科学评论家Matt Ridley. 这篇评论

副tab标题-请问网站的经典案例一般怎样设计?

问题描述 请问网站的经典案例一般怎样设计? 很多网站里面有经典案列内容,一般是有一个主tab标题,几个副tab标题, 右边放一个更多的链接,而下面放一个图片列表,及对应的标题. 一般是这样设计吗? 解决方案 不知道你说的经典案例是什么意思.这个没有什么特定的规范,你按照和你业务差不多的模仿即可.相同类型的网站,比如购物,国内一窝蜂模仿京东,但是国外的网站就不是这样.这个说明行业内小范围内的抄袭并不说明网站的设计必须一样.