利用tensorflow编写卷积神经网络(CNN)对CIFAR-10进行识别(附完整代码)

前言

  其实,在tensorflow官网中就有用tensorflow实现CNN的教程及源码,但在其教程的开头就有这么一句话“注意:本教程适用于对Tensorflow有丰富经验的用户,并假定用户有机器学习相关领域的专业知识和经验。”而我读完整篇教程后,才发现我也就只理解了这句话的含义,对于Tensorflow如何实现CNN还是一头雾水,即便它也附带了源码,我也不知该如何使用。因此只好另寻他法。直到我在YouTube上搜到了Hvass Laboratoriestensorflow教程,并通过分析实践才对CNN的实现方法,代码结构及用法有了清晰的了解。因此,本教程中的代码也是那位大神写的,我只是拿来重新组织并分析了一下。请注意,通过本教程并不会教你CNN的理论知识,毕竟我没那个水平,就不浪费你的时间了,如果你对CNN不甚了解,可以先去看看CNN的理论知识。

  首先介绍一下我运行程序的环境吧,当然并不是一定只有这个环境才能运行,但,建议最好还是能保持一致,这样可以节约你大量的时间和精力。

  • Python的版本:python3.5.2

  • 系统:Ubuntu16.04

  有了以上两点共识,可能遇到的问题就减少了一大半,那剩下的一般就是各种依赖包的安装了,我着实在这方面花费了不少功夫。运行该程序需应用到许多第三方的包,因此,正确的安装好所有用到的包是程序运行的前提,大部分包都比较好安装,有几个值得注意,后面会介绍。



1.什么是CIFAR-10

CIFAR-10是由Alex Krizhevsky, Vinod Nair以及 GeoffreyHinton收集的一个用于普世物体识别的数据集,其中Cifar是加拿大牵头投资的一个先进科学项目研究所。

CIFAR-10数据集包含10个类别的6万张32*32的彩色图片,每个类别6千张。其中5万张是训练集,另外1万张是测试集。下面是数据集中一些数据图形化的结果:

利用tensorflow编写卷积神经网络(CNN)对CIFAR-10进行识别(附完整代码)_第1张图片

数据集解压后可以看到5个训练用的数据分支和一个测试用的分支:


可以在官网中下载该数据集,当然,后面所给的程序中,会有自动下载的功能。


2.代码结构

本教程的代码可以在我的github上面下载:

https://github.com/lqsherlock/tensorflow-CNN-CIFAR-10

主要包含三个文件:

cifar10-main.py---包含了构建和验证神经网络的代码

cifar10-rescover.py---包含了从保存的检查点中恢复先前训练好的神经网络的代码cifar10.py;download.py;dataset.py;cache.py---一些辅助代码

每个文件里面都包含了大量的注释,尤其是关键的地方还有详细的中文注释。


3.各种依赖包的安装

3.1 tensorflow的安装:

这个在tensorflow的官网上有详细介绍:

https://www.tensorflow.org/versions/r0.11/get_started/os_setup.html

安装的方式有多种,在这里我只介绍pip的方式,我用的是python3.5,所以对应命令如下:

Export  TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.11.0-cp35-cp35m-linux_x86_64.whl

pip3install --ignore-installed --upgrade $TF_BINARY_URL

只需以上两步便可

3.2 prettytensor的安装

这个包不常用(至少网上相关资料比较少),一开始我打算用anaconda环境,这样大部分包就不用再安装的,但万万没想到anaconda里面没有这个包,而且也无法通过conda命令安装这个包,到是通过pip命令可以安装,而我在网上也没有找到anaconda调用pip所安装的包的方法,因此只能舍弃anaconda了,改用pip安装所需要的包。注意prettytensor依赖tensorflow包(而且版本号是0.9及以上),因此在安装prettytensor之前需先安装tensorflow等包。然后执行如下命令:

Sudo pip3  install prettytensor

3.3 matplotlib包

该包有一个依赖包tkinter的安装方式比较特别,需要用到apt-get:

sudoapt-get install python3-tk

安装好tkinter后再用pip3 install matplotlib就可以安装好了

3.4 sklearn的安装

该包对于机器学习比较常用,包含了大量机器学习的库,而且调用方便,值得一学。在安装该包之前,需要确保已经安装了numpy,scipy,matplotlib等包,这些都是比较常用的,都可以通过pip3 install命令安装,最后再安装sklearn就好了。


其他的包比较常见,如果出现问题根据提示安装相应的依赖包也好解决。


4.运行代码

4.1 首先在我的github上下载源代码

https://github.com/lqsherlock/tensorflow-CNN-CIFAR-10

 

4.2 解压到桌面

利用tensorflow编写卷积神经网络(CNN)对CIFAR-10进行识别(附完整代码)_第2张图片

 

4.3 打开cifar10-main.py文件,将如图所示的黄色路径修改成你电脑中的路径(主要是修改home/后面的名称)

利用tensorflow编写卷积神经网络(CNN)对CIFAR-10进行识别(附完整代码)_第3张图片

 

 

4.4 打开终端通过python3命令运行cifar10-main.py文件:

如:python3/home/lq/桌面/tensorflow-CNN-CIFAR-10-master/cifar10-main.py (修改成你的路径)

 

4.5 然后就是训练过程,程序中默认是训练200次,在我的电脑上运行了大约3分钟,训练两百次后的精度大约是37.5%

利用tensorflow编写卷积神经网络(CNN)对CIFAR-10进行识别(附完整代码)_第4张图片

 

下图是被一些被错误分类的数据

利用tensorflow编写卷积神经网络(CNN)对CIFAR-10进行识别(附完整代码)_第5张图片

 

将弹出来的这个图片关闭后,终端便显示这次测试的混淆矩阵

利用tensorflow编写卷积神经网络(CNN)对CIFAR-10进行识别(附完整代码)_第6张图片


5.从保存的数据中回复

  上一节运行的程序是cifar10-main.py中的代码,如果你仔细看过代码后会发现在训练阶段,每训练1000次,就会将当前网络的状态进行保存。那么如何将保存的状态进行恢复呢,这需要用到cifar10-rescover.py中的代码,同样只需要将和上一节一样,修改代码的路径就可以了。



6.总结

  该代码经过150000次迭代后,神经网络的识别率在79%-80%。如果想要进行优化可以从如下几点考虑:

  • 正则化
  • 增加神经网络层数
  • 使用正确的代价函数
  • 使用好的权重初始化技术
  • 人为拓展训练集
  • 弃权技术
  由于CNN所涉及的自由参数比较多,想要进行优化,确实还是有挺大的难度。





参考链接:

https://www.youtube.com/watch?v=3BXfw_1_TF4&list=PL9Hr9sNUjfsmEu1ZniY0XpHSzl5uihcXZ&index=6

 

http://www.cs.toronto.edu/~kriz/cifar.html

 

http://www.tensorfly.cn/

 

http://m.blog.csdn.net/article/details?id=50738311

 

http://www.bubuko.com/infodetail-786706.html

 


你可能感兴趣的:(机器学习)