简单的前向传播神经网络 识别手写数字

原理

    为什么我们选择神经网络来实现人工智能。因为就目前来说,最神奇的计算机应该是我们的大脑。所以我们模仿我们大脑的运作方式,通过产生一个一个神经元来完成某一个小任务,进而组成强大的神经网络来实现复杂的非线性问题。每一个神经元并不是去完成某一个特定任务,在不同的问题下,相同的神经元可能在完成不同的任务,这完完全全取决于问题的模型是什么。正如我们的大脑一样,掌管听觉的神经部分,在接受到视觉信号,并经过一段时间训练后,也能完美得胜任此任务。

效果


    可以看到,正确率相比Logistic Regression来说,还是有所提升。虽然提升不大,但要知道我们仅仅是简单的三层网络,所以效果还是很不错的。

模型


    在该模型下,我们选择了三层神经网络,分别对应着输入层,隐藏层和输出层。输入层设置了401个神经元,分别对应400个像素点的值,外加一个偏置单元(可以理解为我们之前的常数项)。第一层神经元的输出是我们的像素点的值a1,乘上我们的权重θ后得到z2,而在这次试验当中,每个神经元的功能是我们之前讲的决策函数,所以经过我们的第一层神经元得到a2;第二层得到输入a2后,乘上第二层神经元的权重得到z3,经过我们的神经元得到a3,得到我们的输出层。输出层是10个神经元,输出结果为0~9的概率,我们选择概率最高的那个结果作为我们的预测结果。

具体实现

需要导入的库


加载数据函数


决策函数


第一层神经网络


第二层神经网络


主函数


补充

    在本次实验当中,我们并没有构造代价函数,构造梯度下降函数来求得模型的参数θ。因为在最开始,我们已经导入了已经训练好的θ值。而如何去求解这个θ值,并不是我们前向传播算法干的,而是反向传播算法的工作,反向传播算法其实也和我们的Logistic Regression求解θ值得过程差不多,也是通过求偏导来实现,只不过因为神经网络的层数往往大于等于三层,所以会运用到一些偏导函数的运算性质,仅此而已。为什么神经网络的效果会比Logistic Regression效果好呢?做完这次试验你不难发现,我们的θ不再只有一个,而是有多个,在多个参数的拟合下,效果当然会比一个参数好啊。当然还有过拟合问题,在Logistic Rgression当中我们可以通过添加正则项来解决,而在神经网络当中,却不行,所以样本一定要多,不然咱们还是洗洗睡吧。

结语

    没学神经网络的时候,感觉很高端。学了以后,发现真的很高端。hhhh,不过总的来说,自己能够把简单的神经网络构建出来,已经很开心了,希望好好努力,加油!

你可能感兴趣的:(简单的前向传播神经网络 识别手写数字)