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)这句话就是真正的训练了。

最终,我们采用一个卷积层(实际上包括了卷积和池化),一个全连接层,三层隐藏层,再一个Softmax输出层,一个输入层,总共五层的深度神经网络:

训练结果如下:


没有训练结果,我第一次训练的时候少加了卷积层,训练了一整天,得到的识别率是97.8%。昨天加了卷积层之后跑了一夜,一个半小时才能训练一个周期,到现在要发了都才跑了十个周期,看来非得配显卡运算的环境才行。按照作者训练的结果是98.78%。(这段话是最后要发之前加上去的)


实际上作者在原书中还采取了不少方法去优化,比如Dropout,扩展数据,增加卷积图层和全连接图层,最终能够达到99.67%的准确率(测试数据),一万个测试数据里面只有33个没有识别成功,实际上这33个有些我们人眼都难得识别:

图中右上角是预期结果,右下角是识别结果。比如第三个,怎么看着都是9,所以已经不能怪计算机了。

至于我为什么没有做这么多优化,得到作者这么漂亮的结果,是因为我的电脑训练起来实在是太慢了。仅仅用CPU(Intel I7-6700)的情况下训练我之前说的情况得一整天,据说使用显卡会快很多(用显卡进行机器学习是华裔计算机科学家、现百度首席科学家吴恩达发现的,目前在机器学习显卡领域做的最好的公司Nvidia的CEO和创始人也是华裔企业家黄仁勋,好像中国人对这块还挺有天赋的),然而在本文出来之时,我已经纠结了大半天的显卡运算环境,都没有成功,所以暂时只能先用CPU运算了。

作者关于神经网络和深度学习的内容基本就讲完啦,下期来介绍下这个领域当前的研究进展,作为本系列的最后一期。

欢迎关注我的微信公众号获取最新文章:

1 0