频道栏目
首页 > 资讯 > 其他综合 > 正文

Make your own Neural NetWork之代码详解下

17-09-05        来源:[db:作者]  
收藏   我要投稿

一些改进:调整学习率

使用我们第一个神经网络的MNIST数据集,仅使用简单的想法和简单的Python,95%的性能得分并不是很糟糕,如果你想停在这里,你将完全有理由。但是让我们看看能否做一些简单的改进。我们可以尝试的第一个改进就是调整学习率。我们把它设置为0.3以前没有真正尝试不同的值。让我们尝试将其倍增到0.6,看看是否有助于实际上对整体网络学习有所帮助或有害。如果我们运行代码,我们的性能得分为0.9047。这比以前更糟。所以看起来像较大的学习率会导致一些弹跳和梯度下降过度。我们再来一次,学习率为0.1。
这一次的表现是0.9523的改善。
它的性能与该网站上列出的具有1000个隐藏节点的性能相似。
我们做得很好!如果我们继续努力,设定一个更小的0.01的学习率会发生什么?
表现不是很好,在0.9241。所以似乎学习速度太小是有害的。
这是有道理的,因为我们限制了梯度下降的速度,我们使步骤太小了。
以下绘制了这些结果的图表。
这不是一个非常科学的方法,因为我们应该多次做这些实验,以减少随机性和不良旅程在渐变下降中的影响,
但是看一般学习速度有一个最佳点的概念仍然是有用的。这里写图片描述

情节表明,在0.1和0.3之间的学习率可能会有更好的表现,所以我们尝试一个学习率0.2。
表现为0.9537。这确实比0.1和0.3好一点点。
这个想法是绘制图形,以获得更好的感觉
在其他情况下你应该考虑的是图片帮助我们比数字列表更好的了解!
所以我们会坚持0.2的学习率,这似乎是MNIST数据集和神经网络的最佳选择。
顺便说一句,如果你自己运行这个代码,你自己的分数会稍有不同,因为整个过程有点随机。
你的初始随机权重与我的初始随机权重不一样,所以你自己的代码将沿着比我的渐变下降采取不同的路线。
一些改进:多次运行我们可以做的下一个改进是对数据集多次重复训练。
有些人称之为每个经历一个迭代。
所以有10个轮次的训练,意味着贯穿整个训练数据集10次。
为什么我们这样做?特别是如果我们的电脑采用的时间长达10或20甚至30分钟?
值得做的事情是,我们通过提供更多的机会爬下这些斜坡来帮助那些重量做这个梯度下降。
让我们用2个轮次来尝试。
代码略有变化,因为我们现在在培训代码周围添加了一个额外的循环。
以下显示了这个外部循环颜色编码,以帮助看到发生了什么。

# 重复训练10遍
# train the neural network
# epochs is the number of times the training data set is used for training
epochs = 10
for e in range(epochs):
    # go through all records in the training data set
    for record in training_data_list:
        # split the record by the ',' commas
        all_values = record.split(',')
        # scale and shift the inputs
        inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
        # create the target output values (all 0.01, except the desired label which is 0.99)
        targets = numpy.zeros(output_nodes) + 0.01
        # all_values[0] is the target label for this record
        targets[int(all_values[0])] = 0.99
        n.train(inputs, targets)
        pass
    pass

由此产生的2个迭代的表现为0.9579,仅仅是1个时期的小幅改善。
就像我们调整学习率一样,让我们尝试一些不同的时代,并绘制一个图形来显示它的效果。
直觉表明,你所做的训练越多,表现越好。
有些人会意识到,太多的培训实际上是坏的,因为网络适合培训数据,然后对以前没有看到的新数据执行不好的操作。
这种过度配合是许多不同类型的机器学习,而不仅仅是神经网络。 发生这种情况:
nn83.png

你可以看到结果不太可预测。
你可以看到约5或7个时代有一个甜蜜点。
之后性能下降,这可能是过度拟合的影响。
在6个时期的下降可能是一个糟糕的运行,网络在梯度下降期间陷入了不利的最小值。
实际上,我预期会有更多的变化,因为我们没有为每个数据点进行许多实验,以减少基本上是随机过程的预期变化的影响。
这就是为什么我离开了这个奇怪的六个时期,提醒我们,神经网络学习是一个随机过程的心脏,有时候不能很好地工作,有时工作非常糟糕。
另一个想法是,对于更多的迭代,学习率太高了。
让我们再次尝试这个实验,将学习率从0.2降低到0.1,看看会发生什么。
峰值表现现在高达0.9628,即96.28%,有7个时期。下图显示了新的表现,学习率为0.1,覆盖到
前一个。
nn84.png

你可以看到,平静下来的学习率确实产生了更多的时代更好的表现。
0.9689的高峰大概误差率为3%,与Yann LeCun网站的网络基准相当。
直观地说,如果您打算长时间(更多的时期)探索渐变下降,您可以承担更短的步骤(学习率),
总体而言,您会发现更好的路径。
似乎这5个迭代可能是这个神经网络针对这个MNIST学习任务的最佳点。
再次记住,我们以非常不科学的方式做到这一点。
要正确做到这一点,您必须对学习速率和时代的每个组合进行多次实验,以最大限度地减少梯度下降中固有的随机性的影响。

更改网络形状

我们尚未尝试的一件事,也许应该早些,就是改变神经网络的形状。
我们来尝试改变中间隐藏层节点的数量。我们已经把它们设置为100太长了!
在我们跳入并运行不同数量的隐藏节点的实验之前,让我们考虑一下如果我们这样做会发生什么。
隐藏层是学习发生的层次。
记住输入节点简单地输入输入信号,输出节点简单地推出网络的答案。
这是隐藏层(或层),必须学习将输入转换为答案。
这是学习发生的地方。
实际上,这是进行学习的隐藏节点之前和之后的链接权重,但是你知道我的意思。
如果我们隐藏的节点太少,比如说3,你可以使用图像,没有足够的空间来学习网络学到的东西,
以某种方式将所有的输入转换成正确的输出。
这就像要一辆有5个座位的车载10人。你只是不能适应这么多内容。
计算机科学家称这种限制是一种学习能力。
您不能学习更多的学习能力,但您可以更改车辆或网络形状,以增加容量。
如果我们有10000个隐藏节点怎么办?
那么我们不会缺少学习能力,但是我们可能会发现训练网络比较困难,因为现在有太多的学习选择。
也许需要10000多个时代来训练这样一个网络。
我们来进行一些实验,看看会发生什么。
nn86.png

您可以看到,对于较少数量的隐藏节点,结果对于较高的数字并不好。
我们预计。但只有5个隐藏节点的表现为0.7001。
这是非常惊人的,因为从这样的几个学习地点,网络仍然是大约70%的权利。
记住我们到目前为止已经运行了100个隐藏节点。
只有10个隐藏的节点获得了我们的0.8998精度,这再次令人印象深刻。
这是我们习惯的节点的1/10,网络的性能跳到了90%。
这一点值得赞赏。神经网络能够很少的隐藏节点或学习位置给出很好的结果。
这是他们力量的证明。
随着我们增加隐藏节点的数量,结果确实有所改善,但并没有显着的提高。
培训网络的时间也大大增加,因为每个额外的隐藏节点意味着新的网络链接到上一层和下一层的每个节点,
这都需要更多的计算!
所以我们必须选择一些具有可容忍的运行时间的隐藏节点。
对我的电脑来说是200个节点。
您的计算机可能会更快或更慢。
我们还为准确度设置了一个新记录,0.9751个200个节点。长达500个节点给了我们0.9762。
这与LeCun上市的基准相比是非常好的
回顾图形,您可以看到,通过改变网络的形状,以前顽固的约95%的精度限制被打破了。

相关TAG标签
上一篇:python基础学习五——函数
下一篇:《effective c++》学习笔记(六)
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站