实战|利用卷积神经网络处理CIFAR图像分类

2017 年 7 月 22 日 全球人工智能

欢迎加入全球最大AI社群>>

来源:知乎  作者:天雨粟

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

整个代码已经放在了我的GitHub上,建议可以把代码pull下来,边看文章边看代码。GitHub地址:https://github.com/NELSONZHAO/zhihu/tree/master/cifar_cnn

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

第一部分

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

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

下面我们就来用scikit-learn实现以下KNN对图像的分类。首先我们需要下载数据文件,网址为 https://www.cs.toronto.edu/~kriz/ci 我们数据包含了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:滤波器的初始化权重

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

在第一个全连接层中我加入了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%。

热门文章推荐

国家战略:国务院发布《新一代人工智能发展规划》

京东发布登月机器学习平台:为第四次零售革命输出AI能力

重磅|中国870家ai公司融资905亿人民币!

浙大女科学家解密:从最后一面逆袭第一名!

资料|麻省理工课程:深度学习数据基础(ppt)

推荐|40张动态图详解全部传感器关注原理!

警惕!中国人工智能有一只推荐算法叫:莆田系算法!

百度Apollo:无人驾驶技术发展成熟仅需3年左右!

阿里出了个Take Go无人便利店,比亚马逊还厉害!

大数据:99%的数据是无用的僵尸数据!

登录查看更多
4

相关内容

“知识神经元网络”KNN(Knowledge neural network)是一种以“神经元网络”模型 为基础的知识组织方法。 在“知识神经元网络”KNN 中,所谓的“知识”,是描述一个“知识”的文本,如一个网页、Word、PDF 文档等。
【实用书】学习用Python编写代码进行数据分析,103页pdf
专知会员服务
192+阅读 · 2020年6月29日
斯坦福2020硬课《分布式算法与优化》
专知会员服务
118+阅读 · 2020年5月6日
一份简短《图神经网络GNN》笔记,入门小册
专知会员服务
224+阅读 · 2020年4月11日
KGCN:使用TensorFlow进行知识图谱的机器学习
专知会员服务
81+阅读 · 2020年1月13日
【GitHub实战】Pytorch实现的小样本逼真的视频到视频转换
专知会员服务
35+阅读 · 2019年12月15日
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
163+阅读 · 2019年10月28日
实战 | 基于深度学习模型VGG的图像识别(附代码)
七月在线实验室
12+阅读 · 2018年3月30日
一个小例子带你轻松Keras图像分类入门
云栖社区
4+阅读 · 2018年1月24日
Tensorflow卷积神经网络
全球人工智能
13+阅读 · 2017年10月14日
开发 | 用 Kaggle 经典案例教你用 CNN 做图像分类!
AI科技评论
5+阅读 · 2017年8月4日
用Kaggle经典案例教你用CNN做图像分类!
AI研习社
6+阅读 · 2017年7月23日
Interpretable CNNs for Object Classification
Arxiv
20+阅读 · 2020年3月12日
Arxiv
7+阅读 · 2020年3月1日
Arxiv
5+阅读 · 2018年9月11日
Arxiv
5+阅读 · 2018年3月6日
Arxiv
3+阅读 · 2018年1月31日
VIP会员
相关论文
Interpretable CNNs for Object Classification
Arxiv
20+阅读 · 2020年3月12日
Arxiv
7+阅读 · 2020年3月1日
Arxiv
5+阅读 · 2018年9月11日
Arxiv
5+阅读 · 2018年3月6日
Arxiv
3+阅读 · 2018年1月31日
Top
微信扫码咨询专知VIP会员