第一章 使用神经网络识别手写数字-4 一个对手写数字进行分类的简单网络

原文:http://neuralnetworksanddeeplearning.com/chap1.html#a_simple_network_to_classify_handwritten_digits

 

  定义好了神经网络,让我们回到手写识别上。我们可以把手写数字识别问题分成两个子问题。第一,我们要有一种将包含多个数字的图像分成一系列独立的图像,每个图像包含一个数字的方法,例如,我们要将下面这个图像分开:

分成6个独立的图像:

这种分割问题对人类来说轻而易举,但是对计算机程序来说,想要准确地分割这些图像却是个挑战。图像分段后,程序需要对每个数字进行分类。因此,我们想要我们的程序识别上图的第一个数字为5

   我们会专注于编写程序解决第二个问题——对每个数字进行分类。这么做是因为一旦你有一个分辨每个数字的好方法,分段问题就没有那么难解决。有很多方法可以解决分割问题。有一招是尝试用不同的方式分割图像,使用单独的数字分类器给每个试验分割评分。如果数字分类器对所有片段都有把握,那个数字分类器便获得高分,如果分类器对一个或多个片段表现糟糕便得低分。思路是如果分类器在哪儿遇到麻烦,那它可能是因为选中的片段是错误的。这个主意和其它变种能很好地用在解决分割问题上。所以与其担心图像分割,我们更专注在一个能够解决更有趣更有挑战的问题的神经网络开发上,问题叫做:识别单个手写数字。

  我们会用一个三层神经网络来识别单个数字:

  网络的输入层包含着输入像素编码值的神经元。下一节会讨论到,我们网络的训练数据由许多扫描手写数字的28*28像素的图像组成。所以输入层包含784=28*28个神经元,为了简化,上图我忽略了784个输入神经元中的大部分,输入是像素灰度值,0.0代表白色,1.0表示纯黑,0-1之间表示逐渐变暗的灰色。

  网络的第二层是一个隐藏层。我们用n表示该隐藏层中神经元的数量,我们将尝试不同的n值。示例展示了一个比较小的隐藏层,值包含n=15个神经元。

  网络的输出层包含10个神经元。如果第一个神经元被激活,即输出≈1,则意味着网络觉得这个数字是0,如果第二个神经元被激活则意味着网络认为数字是1,以此类推。有些碰巧的是,我们刚好对神经元从0-9进行编号,然后找出哪个神经元的激活值最高。如果激活值最高的神经元是神经元6号,我们的网络则猜测输入数字是6,对其它输出神经元,依此类推。

  可能你会好奇我们为什么用10个输出神经元。毕竟,该网络的目标就是告诉我们哪个数字(0、1、2……9)对应哪个输入图像。一种看似自然的方法是仅用4个神经元作为输出,把每个神经元当作二进制的一位,基于神经元的输出是否接近0或1,4个神经元已经足够编码答案,因为2的4次方等于16比输入数字的10个可能值已经多了,为什么我们的网络要用10个输出来代替?那不是很低效吗?最终的理由是经验性的:我们尝试两种不同设计,结果表明,对这个特定的问题,10个神经元的网络比4个神经元的学的更好。但是那使我们很好奇为什么10个输出神经元效果更好。是否有一些启发可以提前告诉我们,应该使用10个输出编码而不是4个?

  理解我们为什么这么做,有助于我们从基础原理上思考神经网络做了什么。首先考虑使用10个输出神经元的情况。让我们将注意力集中在第一个输入神经元上,尝试判断数字是不是0的那个神经元。它通过衡量隐藏层神经元的权重来做到这一点。隐藏层的神经元做了什么?好吧,仅为了论证的目的,假设隐藏层的第一个神经元检测是否存在如下图像:

  它可以通过对与图像重叠的输入进行加权,不重叠像素减少权重来实现此目的。类似的,为了论证我们假设网络隐藏层的第二个、第三个、第四个神经元分别检测是否为下列图像:

  你可能已经猜到,这4个图像放到一起构成了我们之前展示的那行数字中的0:

  所以如果这4个隐藏神经元都激活我们便能得出这个数字就是一个0。当然,这不是我们能用来得出图像是0的唯一证据——我们能够用许多不同的方法得到0(例如,翻转图片,轻微失真)但似乎可以肯定地说至少在这个案例中我们能够得出输入的图像是一个0。

  以这种方式假设神经网络的功能,我们能够就“为什么10个输出的网络比4个输出的更好”给出一个合理的解释。如果我们有4个输出,那么第一个输出神经元就会尝试判断数字的最高位二进制值是什么,没有容易的方法把最高位和上面展示的那些简单形状联系在一起。很难想象有什么好的历史原因说明,数字的部分形状和输出二进制的最高位密切相关。

   目前,我们所说的一切,只是一个启发式。没有什么说三层神经网络必须是我描述的样子——隐藏层神经元用来检测图片的部分形状。或许一个聪明的学习算法能够发现一些权重分配方式使得我们只要4个输出神经元。但是作为一种启发式方法我描述的思维方式非常有效,并可以你节省设计神经网络架构的大量时间。

练习:

有一种方法可以通过在上面的三层网络中添加一个额外的层来确定数字按位表示。额外层将上一层的输出转化为二进制表示,如下图所示。假设前3层神经元在第三层的正确输出(即,旧的输出层)激活值至少有0.99, 不正确的输出激活值小于0.01。找出一个新输出层的权重和偏差集。

 

 

设wjkl是第l层第j个神经元和上一层第k个神经元的权重,第4层神经元的偏差bias全设为0

第3层第1个神经元于第4层4个神经元的权重为[w114,w214,w314,w414]

第3层1-10个神经元到下一层的权重的一个解集为下面矩阵的转置

[

  [0,0,0,0],

  [0,0,0,1],

  [0,0,1,0],

  [0,0,1,1],

  [0,1,0,0],

  [0,1,0,1],

  [0,1,1,1],

  [1,0,0,0],

  [1,0,0,1],

  [1,0,1,0]

]T

=[

  [0,0,0,0,0,0,0,1,1,1],

  [0,0,0,0,1,1,1,0,0,0],

  [0,0,1,1,0,0,1,0,0,1],

  [0,1,0,1,0,1,1,0,1,0]

]

 

posted @ 2020-03-17 13:56  J6`  阅读(395)  评论(0编辑  收藏  举报