6 Cifar-10分类

Cifar 是加拿大政府牵头投资的一个先进科学项目研究所。Hinton、Bengio和他的学生在2004年拿到了 Cifar 投资的少量资金,建立了神经计算和自适应感知项目。这个项目结集了不少计算机科学家、生物学家、电气工程师、神经科学家、物理学家、心理学家,加速推动了 Deep Learning 的进程。从这个阵容来看,DL 已经和 ML 系的数据挖掘分的很远了。Deep Learning 强调的是自适应感知和人工智能,是计算机与神经科学交叉;Data Mining 强调的是高速、大数据、统计数学分析,是计算机和数学的交叉。

Cifar-10 是由 Hinton 的学生 Alex Krizhevsky、Ilya Sutskever 收集的一个用于普适物体识别的数据集。

6.1 提出问题

我们在前面的学习中,使用了MNIST和Fashion-MNIST两个数据集来练习卷积网络的分类,但是这两个数据集都是单通道的灰度图。虽然我们用彩色的几何图形作为例子讲解了卷积网络的基本功能,但是仍然与现实的彩色世界有差距。所以,本节我们将使用Cifar-10数据集来进一步检验一下卷积神经网络的能力。

图18-41是Cifar-10的样本数据。

图18-41 Cifar-10样本数据

  1. airplane,飞机,6000张
  2. automobile,汽车,6000张
  3. bird,鸟,6000张
  4. cat,猫,6000张
  5. deer,鹿,6000张
  6. dog,狗,6000张
  7. frog,蛙,6000张
  8. horse,马,6000张
  9. ship,船,6000张
  10. truck,卡车,6000张

Cifar-10 由60000张32*32的 RGB 彩色图片构成,共10个分类。50000张训练,10000张测试。分为6个文件,5个训练数据文件,每个文件中包含10000张图片,随机打乱顺序,1个测试数据文件,也是10000张图片。这个数据集最大的特点在于将识别迁移到了普适物体,而且应用于多分类(姊妹数据集Cifar-100达到100类,ILSVRC比赛则是1000类)。

但是,面对彩色数据集,用CPU做训练所花费的时间实在是太长了,所以本节将学习如何使用GPU来训练神经网络。

6.2 环境搭建

我们将使用Keras[1]^{[1]}[1]来训练模型,因为Keras是一个在TensorFlow平台上经过抽象的工具,它的抽象思想与我们在前面学习过的各种Layer的概念完全一致,有利于读者在前面的基础上轻松地继续学习。环境搭建有很多细节,我们在这里不详细介绍,只是把基本步骤列出。

  1. 安装Python 3.6(本书中所有案例在Python 3.6上开发测试)
  2. 安装CUDA(没有GPU的读者请跳过)
  3. 安装cuDNN(没有GPU的读者请跳过)
  4. 安装TensorFlow,有GPU硬件的一定要按照GPU版,没有的只能安装CPU版
  5. 安装Keras

安装好后用pip list看一下,关键的几个包是:

Package              Version
-------------------- ---------
Keras                2.2.5
Keras-Applications   1.0.8
Keras-Preprocessing  1.1.0
matplotlib           3.1.1
numpy                1.17.0
tensorboard          1.13.1
tensorflow-estimator 1.13.0
tensorflow-gpu       1.13.1

如果没有GPU,则"tensorflow-gpu"一项会是"tensorflow"。

6.3 代码实现

batch_size = 32
num_classes = 10
epochs = 25
data_augmentation = True
num_predictions = 20
save_dir = os.path.join(os.getcwd(), 'saved_models')
model_name = 'keras_cifar10_trained_model.h5'# The data, split between train and test sets:
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')# Convert class vectors to binary class matrices.
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))# initiate RMSprop optimizer
opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)# Let's train the model using RMSprop
model.compile(loss='categorical_crossentropy',optimizer=opt,metrics=['accuracy'])x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255if not data_augmentation:print('Not using data augmentation.')model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,validation_data=(x_test, y_test),shuffle=True)
else:...

在这个模型中:

  1. 先用卷积->激活->卷积->激活->池化->丢弃层,做为第一梯队,卷积核32个;
  2. 然后再用卷积->激活->卷积->激活->池化->丢弃层做为第二梯队,卷积核64个;
  3. Flatten和Dense相当于把池化的结果转成Nx512的全连接层,N是池化输出的尺寸,被Flatten扁平化了;
  4. 再接丢弃层,避免过拟合;
  5. 最后接10个神经元的全连接层加Softmax输出。

为什么每一个梯队都要接一个DropOut层呢?因为这个网络结果设计已经比较复杂了,对于这个问题来说很可能会过拟合,所以要避免过拟合。如果简化网络结构,又可能会造成训练时间过长而不收敛。

6.4 训练结果

在GPU上训练

在GPU上训练,每一个epoch大约需要1分钟;而在一个8核的CPU上训练,每个epoch大约需要2分钟(据笔者观察是因为并行计算占满了8个核)。所以即使读者没有GPU,用CPU训练还是可以接受的。以下是在GPU上的训练输出:

Epoch 1/25
1563/1563 [==============================] - 33s 21ms/step - loss: 1.8770 - acc: 0.3103 - val_loss: 1.6447 - val_acc: 0.4098
......
Epoch 25/25
1563/1563 [==============================] - 87s 55ms/step - loss: 0.8809 - acc: 0.6960 - val_loss: 0.7724 - val_acc: 0.7372Test loss: 0.772429921245575
Test accuracy: 0.7372

经过25轮后,模型在测试集上的准确度为73.72%。

在CPU上训练

在CPU上训练,只设置了10个epoch,一共半个小时时间,在测试集上达到63.61%的准确率。观察val_loss和val_acc的趋势,随着训练次数的增加,还可以继续优化。

Epoch 1/10
1563/1563 [==============================] - 133s 85ms/step - loss: 1.8563 - acc: 0.3198 - val_loss: 1.5658 - val_acc: 0.4343
......Epoch 10/10
1563/1563 [==============================] - 131s 84ms/step - loss: 1.0972 - acc: 0.6117 - val_loss: 1.0426 - val_acc: 0.636110000/10000 [==============================] - 7s 684us/step
Test loss: 1.042622245979309
Test accuracy: 0.6361

代码位置

ch18, Level6

参考资料

[1] 参考 https://keras.io/examples/cifar10_cnn/

CNN | 06Cifar-10分类相关推荐

  1. 【神经网络】(4) 卷积神经网络(CNN),自定义网络,案例:彩色图像10分类

    各位同学大家好,今天和大家分享一下TensorFlow2.0中如何使用函数方法自定义卷积神经网络. 1. 导入数据 获取系统自带的10分类图像数据,50k张用于训练,10k张用于测试. # 10分类卷 ...

  2. DL之LiRDNNCNN:利用LiR、DNN、CNN算法对MNIST手写数字图片(csv)识别数据集实现(10)分类预测

    DL之LiR&DNN&CNN:利用LiR.DNN.CNN算法对MNIST手写数字图片(csv)识别数据集实现(10)分类预测 目录 输出结果 设计思路 核心代码 输出结果 数据集:Da ...

  3. linux tf2 中文,tf2+cnn+中文文本分类优化系列(2)

    1 前言 接着上次的tf2+cnn+中文文本分类优化系列(1),本次进行优化:使用多个卷积核进行特征抽取.之前是使用filter_size=2进行2-gram特征的识别,本次使用filter_size ...

  4. 利用CNN进行句子分类的敏感性分析

    原文标题 A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sente ...

  5. 【信号识别】基于matlab深度学习CNN信号调制分类【含Matlab源码 2066期】

    ⛄一.深度学习CNN信号调制分类概述 1 背景介绍 在通信信号处理领域, 特别是在非协作通信信号盲解调研究领域, 每时隙突发信号的调制方式不同, 必须进行信号的调制方式自动识别.信号的调制方式识别效果 ...

  6. 译文:Relation Classification via Multi-Level Attention CNNs 使用多层级attention机制的CNN进行关系分类

    通过多层面的attention CNN的关系分类 原文:Relation Classification via Multi-Level Attention CNNs http://eprints.bi ...

  7. 【Python深度学习】基于Tensorflow2.0构建CNN模型尝试分类音乐类型(二)

    前情提要 基于上文所说 基于Tensorflow2.0构建CNN模型尝试分类音乐类型(一) 我用tf2.0和Python3.7复现了一个基于CNN做音乐分类器.用余弦相似度评估距离的一个音乐推荐模型. ...

  8. 基于卷积神经网络CNN的水果分类预测,卷积神经网络水果等级识别

    目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 卷积神经网络CNN水果分类预测 基本结构 主要参 ...

  9. 使用CNN做文本分类——将图像2维卷积换成1维

    使用CNN做文本分类from __future__ importdivision, print_function, absolute_importimporttensorflow as tfimpor ...

  10. CNN在文本分类的应用(内有代码实现) 论文Convolutional Neural Networks for Sentence Classification

    一.CNN文本分类简介 文本分类是NLP领域的一个重要子任务,文本分类的目标是自动的将文本打上已经定义好的标签,常见的文本分类任务有: 用户评论的情感识别 垃圾邮件过滤 用户查询意图识别 新闻分类 由 ...

最新文章

  1. 宠粉福利,100G网盘最新架构技术资料合集限时领
  2. Docker 配置固定IP及桥接的实现方法(转载)
  3. python学习-字符串格式化
  4. 一段H264数据的分析
  5. Cordova自定义插件
  6. 利用Pandas库进行简单的数据分析(数据清洗)
  7. linux kvm虚拟化ha,基于RHEL6.3-KVM三节点虚拟机命令行搭建HA
  8. 解决RecyclerView瀑布流效果结合Glide使用时图片变形的问题
  9. Druid monitor中SQL监控显示不出数据(已解决)
  10. 大学生期末网页制作代码以及网页设计排版技巧
  11. Office 之将 PPT 图片完美插入 Word
  12. 麦弗逊悬架硬点布置 根据设计输入,布置麦弗逊悬架硬点坐标,匹配转向拉杆断开点,匹配车轮外倾角和前束值,从而获得硬点初版坐标
  13. 不要随便设置随机种子
  14. 运营_APP的常见盈利模式
  15. [教程资源] HTC Vive UI Guideline
  16. web前端框架——Vue的特性
  17. RateLimiter高并发访问限流
  18. 4. 同步方式(增量和全量)
  19. 解决安装import nonebot后报错importError问题
  20. 计算机格式化磁盘6,装机必学:硬盘分区、格式化通用方法大全

热门文章

  1. React.js实现原生js拖拽效果及思考
  2. 【Java基础】NoClassDefFoundError 和 ClassNotFoundException的定义及其区别
  3. Ubuntu中使用apt-get时无法搜索软件的解决方法
  4. 蓝牙在汽车领域中的应用
  5. Python super细节整理
  6. 中国环境污染的解决方案
  7. 仿手机端京东商城html源码_web前端入门到实战:制作仿京东商城-商品列表商品筛选功能...
  8. 戴森“新我发现所”苏州线下体验展启幕 以颠覆性科技传递护发造型新理念
  9. SWUSTOJ #78 计算生日是星期几
  10. 饥荒联机版好友服务器未响应,饥荒联机版机器人wx-78使用心得