BP神经网络(手写数字识别)
1实验环境
实验环境:CPU i7-3770@3.40GHz,内存8G,windows10 64位操作系统
实现语言:python
实验数据:Mnist数据集
程序使用的数据库是mnist手写数字数据库,数据库有两个版本,一个是别人做好的.mat格式,训练数据有60000条,每条是一个784维的向量,是一张28*28图片按从上到下从左到右向量化后的结果,60000条数据是随机的。测试数据有10000条。另一个版本是图片版的,按0~9把训练集和测试集分为10个文件夹。这里选取.mat格式的数据源。
2 BP(back propagation)神经网络
是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络。从结构上讲,BP网络具有输入层、隐藏层和输出层。
3图像转换成数据
图像是由像素组成,每个像素点由红(Red)、绿(Green)、蓝(Blue)三原色组成的,可用RGB表示。例如一个28*28的图片

放大后

图像可以存储成3个28*28的矩阵,第一个表示R的取值(0~255)、第二个表示G的取值(0~255)、第三个表示B的取值(0~255)。
而本例只表示黑白颜色即可,可以将上图转换为1个28*28的矩阵,白~黑由0~255表示,例如颜色越浅数字越小,0表示白,255表示黑。而mnist的mat格式数据源已经将60000条训练集和10000条测试集做了上述处理。
4感知机
感知机接收一些二元变量,然后输出一个二元变量。

上图的感知机模型有三个输入,一个输出。 怎样计算输出值呢? Rosenblatt提出了一个简单的算法。他引入了新的实数值变量:。用于表示相对于输出变量每个输入变量的重要性(权重)。

通过变化w和 threshold我们就得到了不同的感知机模型。
5 Sigmoid神经元
对于一个神经网络而言,什么是学习?我们可以认为学习就是给定输入,不断的调整各个权重和偏置,以使得神经网络的输出就是我们想要的结果。这就要求神经网络具有一种性质:改变某一个权重或偏置很小的值,整个神经网络的输出也应该改变很小(数学上,函数连续且可导)。否则这种学习就会非常困难。
不幸的是,感知机组成的神经网络就不具有这种性质。很可能你只是靴微改变某一个权重的值,整个神经网络的输出却会发生质变:原来输出0,现在输出1.
碰到这个问题怎么办呢?前人因此引入了一种新的神经元类型:Sigmoid神经元。
不同于感知机的是,输入变量不仅可以取值0或1,还可以取值0和1之间的任何实数!输出值也不局限于0或1,而是sigmoid函数

sigmoid神经元其实可以看作感知机的平滑化


6神经网络结构
三层结构,输入层有28*28=784个节点,隐藏层节点数可以变化,输出层有10个节点,表示0~9,若识别数字为1,则输出结果为0100000000,若识别数字为9,则输出结果为0000000001.

下面说明一下各层的表示和各层的关系:(以15个隐藏层节点为例)
输入层:X=(x1,x2,x3…x784)
隐藏层:Y=(y1,y2,y3…y15)
输出层:O=(o1,o2,o3…o10)
两个权重:
输入层到隐藏层的权重:V=(V1,V2,V3…V784),Vj是一个列向量,表示输入层所有神经元通过Vj加权,得到隐藏层的第j个神经元
隐藏层到输出层的权重:W=(W1,W2,W3…W15),Wk是一个列向量,表示隐藏层的所有神经元通过Wk加权,得到输出层的第k个神经元
根据我们上面说到的单个神经元的刺激传入和刺激传出,相信到这里很多人应该已经得出下面的各层之间的关系了:

注意:上述公式还要加上偏移量
7误差反向传播算法
如何求得W和V呢,这里要用到一种算法,就是误差反向传播算法(Error Back Propagation Algorithm) ,简称BP 算法。
首先随机地初始化W和V的值,然后代入一些图片进行计算,得到一个输出,当然由于W和V参数不会刚好很完美,输出自然不会是像上文说的,刚好就是{1 0 0 0 0 0 0 0 0 0}这一类,例如{0.7 0 0 0.1 0.2 0 0 0 0 0.1}.所以存在误差,根据这个误差就可以反过来修正W和V的值,修正后的W和V可以使输出更加的靠近于理想的输出,这就是所谓的“误差反向传播”的意思,修正一次之后,再代入其他一些图片,输出离理想输出又靠近了一点,我们又继续计算误差,然后修正W和V的值,就这样经过很多次的迭代计算,最终多次修正得到了比较完美的W和V矩阵,它可以使得输出非常靠近于理想的输出,至此我们的工作完成度才是100%了。
逆向传播算法的数学推导.....(No figures are omitted below)
推导结果:


d表示正确标签,o表示训练输出,y表示隐藏层的值。另外为了使权值调整更加灵活加入一个放缩倍数η(权值学习率)使得,

改变η的大小即可改变每一次调节的幅度,η大的话调节更快,小则调节慢,但是过大容易导致振荡。
8手写体数字识别算法实现步骤
1) 读入训练数据:训练样本、训练样本标签
2) 神经网络配置:参数的初始化(各层节点数、各层权值学习率、各层偏移量等)
3) 激活函数实现:sigmoid函数
4) 训练:60000个数据量的训练集;前向过程,后向过程(反馈调整各层权重和偏移量)
5) 测试:10000个数据量的测试集,获取正确率
9程序结果分析
主要参数:
输入层节点数,隐藏层节点数,输出层节点数,输入层权矩阵,隐藏层权矩阵,输入层偏置向量,隐藏层偏置向量,输入层权值学习率,隐藏层学权值习率
不可变参数:
输入层节点数(784),输出层节点数(10)
随机参数(随机数生成):
输入层权矩阵,隐藏层权矩阵,输入层偏置向量,隐藏层偏置向量
可控参数:
隐藏层节点数,输入层权值学习率,隐藏层学权值习率
隐藏层节点数对算法的影响:
参数表1
|
隐藏层节点数 |
10 |
|
输入层权值学习率 |
0.3 |
|
隐藏层学权值习率 |
0.3 |
结果1(20s)
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
|
测试集 |
980 |
1135 |
1032 |
1010 |
982 |
892 |
958 |
1028 |
974 |
1009 |
|
正确数 |
946 |
1111 |
860 |
906 |
915 |
754 |
887 |
896 |
800 |
903 |
|
正确率 |
96.5% |
97.9% |
83.3% |
89.7% |
93.2% |
84.5% |
92.6% |
87.2% |
82.1% |
89.5% |
|
总 |
89.78% |
|||||||||
参数表2
|
隐藏层节点数 |
15 |
|
输入层权值学习率 |
0.3 |
|
隐藏层学权值习率 |
0.3 |
结果2(27s)
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
|
测试集 |
980 |
1135 |
1032 |
1010 |
982 |
892 |
958 |
1028 |
974 |
1009 |
|
正确数 |
948 |
1117 |
873 |
909 |
872 |
751 |
929 |
898 |
867 |
950 |
|
正确率 |
96.7% |
98.4% |
84.6% |
90.0% |
88.8% |
84.2% |
97.0% |
87.4% |
89.0% |
94.2% |
|
总 |
91.14% |
|||||||||
参数表3
|
隐藏层节点数 |
30 |
|
输入层权值学习率 |
0.3 |
|
隐藏层学权值习率 |
0.3 |
结果3(46s)
|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
|
测试集 |
980 |
1135 |
1032 |
1010 |
982 |
892 |
958 |
1028 |
974 |
1009 |
|
正确数 |
953 |
1124 |
913 |
963 |
931 |
796 |
919 |
919 |
892 |
952 |
|
正确率 |
97.2% |
99.0% |
88.5% |
95.3% |
94.8% |
89.2% |
95.9% |
89.4% |
91.6% |
94.4% |
|
总 |
93.62% |
|||||||||
当隐藏层节点数增到100时,算法跑了137s,总正确率为94.94%
算法正确率收敛于95%……算法遇到了瓶颈......
权值学习率对算法的影响:
输入节点784,隐藏层节点10,输出层节点10

令输入层和隐藏层权值学习率共用一个参数的条件下,权值学习率n取值范围为[0.1,1]算法正确率最高。
算法手写体数字识别
正确率较高的数字是1、0
正确率较低的数字是2、5
谢 谢! 未 完 待 续 ...
BP神经网络(手写数字识别)的更多相关文章
- 基于Numpy的神经网络+手写数字识别
基于Numpy的神经网络+手写数字识别 本文代码来自Tariq Rashid所著<Python神经网络编程> 代码分为三个部分,框架如下所示: # neural network class ...
- TensorFlow 卷积神经网络手写数字识别数据集介绍
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 手写数字识别 接下来将会以 MNIST 数据集为例,使用卷积层和池 ...
- 深度学习-使用cuda加速卷积神经网络-手写数字识别准确率99.7%
源码和运行结果 cuda:https://github.com/zhxfl/CUDA-CNN C语言版本参考自:http://eric-yuan.me/ 针对著名手写数字识别的库mnist,准确率是9 ...
- 深度学习(一):Python神经网络——手写数字识别
声明:本文章为阅读书籍<Python神经网络编程>而来,代码与书中略有差异,书籍封面: 源码 若要本地运行,请更改源码中图片与数据集的位置,环境为 Python3.6x. 1 import ...
- 神经网络手写数字识别numpy实现
本文摘自Michael Nielsen的Neural Network and Deep Learning,该书的github网址为:https://github.com/mnielsen/neural ...
- BP神经网络的手写数字识别
BP神经网络的手写数字识别 ANN 人工神经网络算法在实践中往往给人难以琢磨的印象,有句老话叫“出来混总是要还的”,大概是由于具有很强的非线性模拟和处理能力,因此作为代价上帝让它“黑盒”化了.作为一种 ...
- 利用c++编写bp神经网络实现手写数字识别详解
利用c++编写bp神经网络实现手写数字识别 写在前面 从大一入学开始,本菜菜就一直想学习一下神经网络算法,但由于时间和资源所限,一直未展开比较透彻的学习.大二下人工智能课的修习,给了我一个学习的契机. ...
- C#中调用Matlab人工神经网络算法实现手写数字识别
手写数字识别实现 设计技术参数:通过由数字构成的图像,自动实现几个不同数字的识别,设计识别方法,有较高的识别率 关键字:二值化 投影 矩阵 目标定位 Matlab 手写数字图像识别简介: 手写 ...
- 【深度学习系列】手写数字识别卷积神经--卷积神经网络CNN原理详解(一)
上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...
- 利用神经网络算法的C#手写数字识别
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 下载Demo - 2.77 MB (原始地址):handwritten_character_recognition.zip 下载源码 - 70. ...
随机推荐
- [ARC083F] Collecting Balls [建二分图+环套树定向+建拓扑图+树的拓扑序计数]
题面 [传送门](https://arc083.contest.atcoder.jp/tasks/arc083_d) 思路 这是一道真正的好题 第一步:转化模型 行列支配类的问题,常见做法就是把行和列 ...
- 使用python读取mysql数据库并进行数据的操作
(一)环境的配置 使用python调用mysql数据库要引进一些库. 目前我使用的python版本是python3.6.引进库为pymysql 其他对应的库可以有以下选择: mysqldb,oursq ...
- 深入解析VueJs中的V-bind指令
v-bind 主要用于属性绑定,比方你的class属性,style属性,value属性,href属性等等,只要是属性,就可以用v-bind指令进行绑定.这次主要介绍了VueJs中的V-bind指令,需 ...
- [codeforces] 25E Test || hash
原题 给你三个字符串,找一个字符串(它的子串含有以上三个字符串),输出此字符串的长度. 先暴力判断是否有包含,消减需要匹配的串的数量.因为只有三个字符串,所以暴力枚举三个串的位置关系,对三个串跑好哈希 ...
- java算法(一) 直接选择排序
一.基本概念 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置(注:要把最大最小的元素和起始的元素交换), 然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以 ...
- 汕头市队赛 SRM14 T2 最长上升子序列
最长上升子序列 (tree.pas/c/cpp) 128MB 1s 有一个长度为n的序列a[i],其中1到n的整数各自在a[i]中出现恰好一次. 现在已知另一个等长的序列f[i],表示a[i]中以第i ...
- JS多个函数之间传递参数问题
JS多个函数之间传递参数的一个重要思想是在页面定义一个隐藏域,当第一个函数请求到数据时候修改隐藏域的值,第二个函数用jQuery的选择器选择页面中隐藏域的值. 比如: 页面中定义一个隐藏的页号. &l ...
- Linux进程管理与调度-之-目录导航【转】
转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:// ...
- Linux内核实践之序列文件【转】
转自:http://blog.csdn.net/bullbat/article/details/7407194 版权声明:本文为博主原创文章,未经博主允许不得转载. 作者:bullbat seq_fi ...
- hdu 1301(最小生成树)
Jungle Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...