神经网络与深度学习(四)—手写数字识别示例下

今天我们来正式试验一下这个程序。

1)编写程序

首先,我们要创建一个python工程,这里我用的Pycharm。点击左上角的file-new project:

如下,创建工程:

然后,我们要把相关的文件放到一个工程下面。如下:

这里,我们的recognition工程文件夹下面包含了四个文件。分别是:

接下来我们要编写一个demo程序,代码如下:

import mnist_loaderimport network

'''输入模块'''training_data,validation_data,test_data=mnist_loader.load_data_wrapper()

'''相关数据'''print("training data")print(type(training_data))print(len(training_data))print(training_data[0][0].shape)print(training_data[0][1].shape)'''答应训练集的各种信息'''print('validation data')print(len(validation_data))'''打印验证集的各种信息'''print('test data')print(len(test_data))

'''打印测试集的各种信息'''net=network.Network([784,30,10])

'''初始化一个神经网络'''net.SGD(training_data,30,10,3.0,test_data=test_data)

'''识别训练'''

接下来,我们来解释这几段代码:

首先,我们输入两个相关的模块,network.py和mnist_loader.py。这里你可能不理解的是mnist_loader.py模块。该模块的任务是,打开数据压缩包文件,将其输入到程序中,以供程序使用。

接下来,是打印相关数据的各种信息,这里验证集(validation_data)并没有使用,后面我们会讲这个是干嘛用的。

然后,创建一个三层的神经网络。其输入层有784个神经元,隐藏层油30个神经元,输出层有10个神经元,代表十个数字。

最后,引用梯度下降算法,输入训练集(training_data),训练30轮,小数据集(mini_batch)大小为10,学习率(eta)为3.0。

2)训练结果

我们先看一下相关数据是否正确,如下:

这里,我们将整个数据集,分成了三部分:训练集(50000),验证集(10000),测试集(10000)。训练集的数据类型为list,其输入层是784个神经元(784维向量),输出层是10个神经元(10维向量)。

测试结果:

我们可以看到前5轮已经达到90%的准确率,这已经比较不错了。我们再看看训练完的准确率:

训练结束,其准确率已经达到(也可以说收敛到)了95%左右的准确率了,也就是说10000张图片(测试集)中,神经网络已经能够正确识别出9500张的图片了,这是很令人惊喜的结果。我们的神经网络程序是很成功的,。

3)测试数据

好了,先按捺住成功的喜悦。你可能会想问,我们为什么会选用(30,10,3.0)这几个参数呢?我试试别的参数,说不定可能会得到更好的结果,说干就干。

(1)学习率

我们先把学习率改到20.0,结果如下:

这次训练花的时间是11分25秒,其准确率让人大跌眼镜,只有百分之30左右。

好吧,我们再改小。改到0.01,看看结果如何:

这次训练花费的时间是11分48秒,准确率还是比较合理的,在90%左右。

(2)mini_batch大小

接下来,我们看看更改小的训练集合大小。我们先把他改成(30,3,3)结果如下:

这次训练花费的时间是12分10秒,其准确率为90%左右。

接下来,再把他改成(30,100,3)结果如下:

这次训练花费的时间是10分20秒,其准确率为95.5%左右。这里,我们发现一个令人惊喜的结果,不仅准确率提高了,而且其训练时间也缩短了不少。训练时间缩短是可以理解的。但是,准确率的提升是我没有想到的。

(3)隐藏层神经元数目大小

我们先把它改为[784,60,10]和(30,10,3)结果如下:

首先,我们直观的感受是,训练时间慢的令人发指。其训练时间是24分32秒,

这意味着,更多的隐藏层神经元数目会拖慢学习时间。然而,令人欣慰的是准确率提升了,提升到96.0%左右。

接下来,我们将其改成[784,3,10]和(30,10,3)结果如下:

训练时间大大缩短了,是7分10秒。但是令人遗憾的是,其准确率让人大跌眼镜,仅仅只有61%左右,看来隐藏层神经元数目太少也不是件好事。

以上测试时间结果可能受到当时电脑所开的程序数量有关,仅供参考。

4)总结

学习率的大小对训练时间没有影响。对准确率有影响:学习率过大则会影响降低准确率。

mini_batch大小对训练时间和准确率都有影响。具体的,看情况。

隐藏层神经元数目大小对训练时间和准确率都有影响,神经元数目越多,准确率越高,训练时间越长;数目越少,准确率越低,训练时间越短。

5)结尾

那么,有这么多的参数,我们该如何能选择合适的参数让他发挥最好的性能呢?除此之外,我们该以什么方法去调试参数呢?还有,我们如何能够再度优化,提高准确率呢?这些后面再讲。

希望有志同道合的小伙伴关注我的公众平台,欢迎您的批评指正,共同交流进步。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180408G1LITD00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券