前言
本文为《Neural Network and Deep Learning》学习笔记(二),可以转载但请标明原文地址。
本人刚刚入门、笔记简陋不足、多有谬误,而原书精妙易懂、不长篇幅常有柳暗花明之处,故推荐阅读原书。
《Neural Network and Deep Learning》下载地址(中文版):Neural Network and Deep Learning(中文版)
注:这本书网上有很多免费版,随便搜一下就有了,不用非得花积分下载我上传的资料。
第二部分:准备篇(搭建神经网络、选择学习算法)
在理论篇中,我们讲述了神经元与神经网络的基本知识,那么下面我们就来搭建一个神经网络吧!
本篇中依然不涉及代码部分,只讲解了一些前期准备过程,想要直接食用源码,可以跳到实践篇。
我们将以【手写数字识别】项目为例进行讲解。
手写数字识别是指:输入一张图片,图片中包含一个数字,输出该数字是什么。
一、搭建一个三层神经网络
在理论篇中,我们讲到:神经网络的架构可以分为三部分:输入层、输出层、隐藏层。下面我们就来分别设计:
1.1 设计输入层(input layer)
输入图片,就相当于输入图片的每一个像素。因此我们设计的网络的输入层,必须包含给输入像素的值进行编码的神经元。
例如,在手写数字识别项目中,我们的输入图像来源于MNIST数据集,这些图像是28×28大小的灰度图像。这意味着我们的输入层需要包含784=28×28个输入神经元,值为0.0表示白色,值为1.0表示黑色,中间数值表示逐渐暗淡的灰色。
这样就完成了输入层的设计。
1.2 设计输出层(output layer)
我们需要的输出是:“判断输入图片是什么数字”,一共有0-9共十个数字,因此我们的输出神经元有10个,将它们按0-9编号。
接下来我们需要人为定义输出值的意义:如果编号为0的输出神经元被激活,那么表明输出是“数字0”;如果编号为1的输出神经元被激活,那么表明输出是“数字1”;以此类推。
这里出现了一个词:“激活”。还记得在理论篇中,我们曾经讲过激活函数吗?激活函数的作用在于:将神经元的输入(x)映射到输出(output),在这里我们将output称作激活值。
我们共有10个输出神经元,每个神经元都有一个output,也就是说都有一个激活值。我们可以这样定义:哪个输出神经元输出的激活值最高,就证明网络判断哪个数字最有可能。
比如:10个输出神经元中,编号为0的神经元激活值最高,那么表明输出是“数字0”.
这样就完成了输出层的设计及输出值的解释定义。
1.3 设计隐藏层(hidden layer)
作者曰:设计隐藏层是一门艺(xuan)术(xue)。
简单起见,我们只设计一层隐藏层,假设该层中有n个隐藏神经元,我们将给n实验不同的数值,观察准确率的变化。
以上,三层神经网络设计完毕,网络拓扑图如下所示:
二、设计学习算法:梯度下降算法
神经网络、机器学习,到底是怎么学习的?!?!学习的到底是什么?!?!
2.1 学习是什么
让我们再来看看我们的激活函数(=S型函数)(=output的计算公式):