Python与人工神经网络(13)——实现卷积神经网络
来源:互联网 发布:大数据来源 编辑:程序博客网 时间:2024/05/19 12:38
上期我们说了卷积神经网络的原理,今天来实现他。
与之前我们改进神经网络时一样,新建一个network3.py文件,来写实现的代码。同样,代码已经推送到了网上:https://git.oschina.net/zxhm/Neural-NetWork-and-Deep-Learning,我把原作者基于python 2.7的代码修改成了基于python3.x的,感兴趣的小伙伴可以下下来瞄一瞄。和往期的代码环节一样,我也对代码做一些说明:
1、我们在最新的代码中使用到了一个交Theano的机器学习框架,这个框架可以非常容易的使用随机梯度下降算法和反向传播算法,在运算的时候也比我们写的代码要快不少(作者说我们写的代码是为了好懂的,不是为了好用的T_T)。在Theano的安装配置过程中会有很多坑,我先在这里列一个安装步骤的提纲,具体去趟坑,还需要自己去做。
①卸载我们原来安装的numpy
②打开这个网址:http://www.lfd.uci.edu/~gohlke/pythonlibs/,下载两个文件:numpy‑1.12.1rc1+mkl‑cp35‑cp35m‑win_amd64.whl,scipy‑0.19.0‑cp35‑cp35m‑win_amd64.whl。这里注意一下,cp35代表对应python3.5的版本,amd64代表是64位。要针对实际情况去下。然后按顺序安装这两个文件(切记不要随便更改文件名)。
③安装Theano
==========不使用GPU训练的到这里就ok了==========
④参考Theano的官方文档:http://deeplearning.net/software/theano/install_windows.html#install-windows,安装GCC、Visual Studio、CUDA、pycuda、cudnn等等,修改配置文件。
第四步虽然有官方文档,但实际上配置起来会有无限多的坑,同样的步骤,同样的配置,换个系统版本或者换个python版本或者换个numpy版本就可能出问题,反正我目前还在坑里面,已经纠结了很久了。
2、代码里面使用到了Softmax前馈函数和线性前馈函数,原理见第九期。
3、代码中使用了Dropout正则化方法,原理见第七期
4、代码中我们建立了三个层,ConvPoolLayer,FullyConnectedLayer,SoftmaxLayer,第一个就是卷积层,包括了卷积和池化,第二个层是全连接层,跟我们以前训练的全连接神经网络一样,当前层的每个神经元都与上一层和下一层的每个神经元相连。全连接层的前馈函数是可选的,这里选用线性函数可以加快训练速度。第三个就是普通的输出层了,只不过使用了Softmax前馈函数。在所有的神经元层的类中,都有相应的实例化方法和input方法,实例化方法主要用于设置进出的数据的形状等信息,input方法就是用于数据的进和出了。之所以作者使用inpt,是因为input是python的内建函数,恐怕引起混淆。
5、数据加载的方法改了,为了适应Theano的数据结构
6、在Network类的构造函数中,有self.x=T.matrix("x")和self.y=T.ivector("y"),分别代表了输入值和预期输出值,分别是一个Theano里面的矩阵和矢量。
7、Network类的SGD方法中,cost,grads,updates三个变量,就使用Theano把随机梯度下降算法给做了,简直方便。cost_ij = train_mb(minibatch_index)这句话就是真正的训练了。
与之前我们改进神经网络时一样,新建一个network3.py文件,来写实现的代码。同样,代码已经推送到了网上:https://git.oschina.net/zxhm/Neural-NetWork-and-Deep-Learning,我把原作者基于python 2.7的代码修改成了基于python3.x的,感兴趣的小伙伴可以下下来瞄一瞄。和往期的代码环节一样,我也对代码做一些说明:
1、我们在最新的代码中使用到了一个交Theano的机器学习框架,这个框架可以非常容易的使用随机梯度下降算法和反向传播算法,在运算的时候也比我们写的代码要快不少(作者说我们写的代码是为了好懂的,不是为了好用的T_T)。在Theano的安装配置过程中会有很多坑,我先在这里列一个安装步骤的提纲,具体去趟坑,还需要自己去做。
①卸载我们原来安装的numpy
②打开这个网址:http://www.lfd.uci.edu/~gohlke/pythonlibs/,下载两个文件:numpy‑1.12.1rc1+mkl‑cp35‑cp35m‑win_amd64.whl,scipy‑0.19.0‑cp35‑cp35m‑win_amd64.whl。这里注意一下,cp35代表对应python3.5的版本,amd64代表是64位。要针对实际情况去下。然后按顺序安装这两个文件(切记不要随便更改文件名)。
③安装Theano
==========不使用GPU训练的到这里就ok了==========
④参考Theano的官方文档:http://deeplearning.net/software/theano/install_windows.html#install-windows,安装GCC、Visual Studio、CUDA、pycuda、cudnn等等,修改配置文件。
第四步虽然有官方文档,但实际上配置起来会有无限多的坑,同样的步骤,同样的配置,换个系统版本或者换个python版本或者换个numpy版本就可能出问题,反正我目前还在坑里面,已经纠结了很久了。
2、代码里面使用到了Softmax前馈函数和线性前馈函数,原理见第九期。
3、代码中使用了Dropout正则化方法,原理见第七期
4、代码中我们建立了三个层,ConvPoolLayer,FullyConnectedLayer,SoftmaxLayer,第一个就是卷积层,包括了卷积和池化,第二个层是全连接层,跟我们以前训练的全连接神经网络一样,当前层的每个神经元都与上一层和下一层的每个神经元相连。全连接层的前馈函数是可选的,这里选用线性函数可以加快训练速度。第三个就是普通的输出层了,只不过使用了Softmax前馈函数。在所有的神经元层的类中,都有相应的实例化方法和input方法,实例化方法主要用于设置进出的数据的形状等信息,input方法就是用于数据的进和出了。之所以作者使用inpt,是因为input是python的内建函数,恐怕引起混淆。
5、数据加载的方法改了,为了适应Theano的数据结构
6、在Network类的构造函数中,有self.x=T.matrix("x")和self.y=T.ivector("y"),分别代表了输入值和预期输出值,分别是一个Theano里面的矩阵和矢量。
7、Network类的SGD方法中,cost,grads,updates三个变量,就使用Theano把随机梯度下降算法给做了,简直方便。cost_ij = train_mb(minibatch_index)这句话就是真正的训练了。
最终,我们采用一个卷积层(实际上包括了卷积和池化),一个全连接层,三层隐藏层,再一个Softmax输出层,一个输入层,总共五层的深度神经网络:
训练结果如下:
没有训练结果,我第一次训练的时候少加了卷积层,训练了一整天,得到的识别率是97.8%。昨天加了卷积层之后跑了一夜,一个半小时才能训练一个周期,到现在要发了都才跑了十个周期,看来非得配显卡运算的环境才行。按照作者训练的结果是98.78%。(这段话是最后要发之前加上去的)
实际上作者在原书中还采取了不少方法去优化,比如Dropout,扩展数据,增加卷积图层和全连接图层,最终能够达到99.67%的准确率(测试数据),一万个测试数据里面只有33个没有识别成功,实际上这33个有些我们人眼都难得识别:
图中右上角是预期结果,右下角是识别结果。比如第三个,怎么看着都是9,所以已经不能怪计算机了。
至于我为什么没有做这么多优化,得到作者这么漂亮的结果,是因为我的电脑训练起来实在是太慢了。仅仅用CPU(Intel I7-6700)的情况下训练我之前说的情况得一整天,据说使用显卡会快很多(用显卡进行机器学习是华裔计算机科学家、现百度首席科学家吴恩达发现的,目前在机器学习显卡领域做的最好的公司Nvidia的CEO和创始人也是华裔企业家黄仁勋,好像中国人对这块还挺有天赋的),然而在本文出来之时,我已经纠结了大半天的显卡运算环境,都没有成功,所以暂时只能先用CPU运算了。
作者关于神经网络和深度学习的内容基本就讲完啦,下期来介绍下这个领域当前的研究进展,作为本系列的最后一期。
欢迎关注我的微信公众号获取最新文章:
1 0
- Python与人工神经网络(13)——实现卷积神经网络
- Python与人工神经网络(12)——卷积神经网络
- Python与人工神经网络(14)——其他技术
- Python与人工神经网络(2)——使用神经网络识别手写图像
- Python与人工神经网络(10)——神经网络可以干什么
- Python与人工神经网络(11)——为什么深度神经网络很难训练
- 人工神经网络的设计与实现(三) BP神经网络
- Python与人工神经网络(6)——过度拟合与正则化
- Python与人工神经网络(1)——开一个新坑
- Python与人工神经网络(3)——随机梯度下降算法
- Python与人工神经网络(4)——反向传播算法
- Python与人工神经网络(5)——交叉熵成本函数
- Python与人工神经网络(7)——其他正则化方法
- Python与人工神经网络(9)——其他改进技术介绍
- Python与人工神经网络(15)——结语和前言
- 神经网络 与 卷积神经网络
- Python实现人工神经网络(反向传播算法)
- 卷积神经网络理解与实现
- c++ string常用函数总结
- 一步一步学springboot (三)使用jsp页面(视图)
- CentOS7开启网络
- Oracle 11g的安装教程详解
- String字符串的可变性(暴力反射)
- Python与人工神经网络(13)——实现卷积神经网络
- QBC查询
- 2017.4.23API的重要类(下)
- Vue.js
- STM32GPIO部分介绍
- A. Buying A House
- 等价变换(equivalent transformation)
- LeetCode094 Binary Tree Inorder Traversal
- 剑指offer 面试题5:从尾到头打印链表