《python神经网络》读书笔记(二)

更多隐藏层

书中分别对比了不同学习率,不同隐藏层结点数和不同训练世代的模型学习效果,没有对比多隐藏层的模型,我自己添加了一层隐藏层的代码,得出的训练结果如下:

世代隐藏层隐藏层结点数学习率识别率训练时长(s)
1210*100.20.767711.5368
1220*200.20.806617.0215
1230*300.20.844217.4176
1220*300.20.798416.7845
1230*200.20.841217.7463
1250*500.20.847120.3632
12100*1000.20.849631.0611
22100*1000.20.863565.3597

可见多一层隐藏层学习效果不但没有提高,反而下降了。

相同训练世代相同学习率的识别率:

10 * 10 < 20 * 30 < 20 * 20 < 30 * 20 < 30 * 30 < 50 * 50

代码

看看训练集的数字图像

把训练集的数组转换成图像,大概浏览一下手写的样子

转换代码:

import numpy as np
import matplotlib.pyplot as plt


with open(r'mnist/mnist_train.csv', 'r') as datafile:
    line = datafile.readline()
    i = 1
    while line and i < 50:
        all_values = line.split(',')
        label = all_values[0]
        img_array = np.asfarray(all_values[1:]).reshape((28, 28))
        # plt.axis('off')
        plt.imshow(img_array, cmap='Greys')
        filename = 'mnist/mnist_images/test' + str(i) +\
                   '_' + label + '.png'
        plt.savefig(filename)
        i += 1
        line = datafile.readline()

更多的训练数据

MNIST有60,000条训练数据,书上为了获得更多的训练数据把每一条训练数据的图像分别顺时针、逆时针旋转了10度,这样就添加了两倍的训练样本。

世代隐藏层隐藏层结点数学习率识别率训练时长(s)是否训练旋转数据
111000.20.951825.4991
111000.20.947170.7045
111000.10.950325.7134
111000.10.954470.7045
111000.010.913126.4683
111000.010.932972.5362
111000.050.944327.1351
111000.050.951973.1557
112000.010.906597.4234
112000.010.9338296.3523
1012000.010.96771115.5962
1012000.010.97772890.7095

当学习率为0.2时,加入旋转训练数据的模型识别率反倒更低,将学习率减小为0.01以后增加旋转数据可以提高识别率,通过学习率0.01和0.05两个模型进一步判断学习率越小,增加旋转训练数据带来的学习率提高越多。但问题是很明显训练样本增多反而导致识别率下降。于是我怀疑我的代码有问题,下载了作者的代码跑,他是200个隐藏层结点、0.01的学习率跑了10个世代,github上他代码跑的结果是0.9754,我下载下来跑的是0.9779,然后我把我的代码改成一样的跑法用了2890.709569秒合48分钟,识别率是0.9777,看来代码没问题。然后我对比了一下10世代不用旋转数据的,识别率是0.9677,看来大样本要进行多世代的学习以后效果才显现,另外正如书上说的,样本量大了以后可以采用更小、更谨慎的学习步长,因此将学习率减少到0.01。

另外我对比了一下我的代码和作者代码的执行效率,100个隐藏层结点0.2学习率1世代我的代码跑了71.5秒,作者的跑了74秒。

问题

上一篇笔记中提到初始化权重的时候正态分布方差使用的是传入链接数也就是上一层结点数,而书上用的是当前结点数,我在看github上的代码时作者已经修正为上一层结点数了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值