BP神经网络手写数字1和9识别

实现效果

上面是训练样本集,下面是测试样本集,识别的是黑色,未识别的是红色
BP神经网络手写数字1和9识别

实现过程

读取样本

样本读取的过程参考这里:过程参考这里

实现思路

我们这里将神经网络的实现过程分为三部曲:
注意:
正向传播的其实就是神经元的分类过程,只不过这里要注意**函数的使用,图中正向f指的就是**函数;
反向传播指的是传递回来的误差Error,注意理解图中反向误差的体现形式;
最后就是更新权重了;
BP神经网络手写数字1和9识别
这里以一个神经元带两个输出为练习:这里从最最简单的一个神经元做起,其实就是隐含层中只有一个神经元的过程,我们的目标是识别手写的1和9,所以,我们的输出层这里有两个输出常规的输出表示中用1和0表示,我们这里为了后期的计算编程,将1和0的标识方式变为{1,0}{0,1}.
BP神经网络手写数字1和9识别

正向传播

这里的计算编程过程紧紧扣住前面的三部曲。不过编程的时候注意,正向输入包含两个各部分的正向输入:
隐含层的正向输出以及输出层的正向输出。
在下面的程序解释中做了详细的说明,这个要结合前面的说明细细体会。
BP神经网络手写数字1和9识别

反向传播

记得前面说的,反向传播传递的是一个误差,这个误差中包含两个部分,一个就是常说的损失函数,我们这里简单的理解说就是目标值与目前实际计算值之间的差值,这里我们还得分为两部分说明:

输出层的误差计算

这个比较简单,参看程序即可,紧扣三部曲便知。主要是隐含层的计算

BP神经网络手写数字1和9识别

隐含层的误差计算

这里要注意,因为要验证手写的1和9,所以我们前面说输出层要有两个输出值,而在利用这两个输出值计算隐含层的反向误差时就要分别计算每一个的误差值,然后将二者加和作为隐含层的误差。如下说明:
BP神经网络手写数字1和9识别
这个过程要结合前面的的程序说明,理解起来应该会更直观一些。搞清楚在误差的加和中,每一个加和项分别是由输出层中的哪个输出参数的误差与哪个权重的乘积。这个单看公式说明理解起来相对复杂,但是结合程序说明,理解起来就会好很多。

权重更新

这里要注意,在权重更新中,有很多优化的方向,紧扣前面的三部曲结合这里的程序说明,查看这里的momentum其实就是很多学者做的优化点。
BP神经网络手写数字1和9识别

效果验证

在理解的过程中注意理解**函数的使用位置以及对**函数求导的位置。此外,之类求导可以类似的结合前面的线性分类器中的求导得方向的概念理解。
BP神经网络手写数字1和9识别