基于BP神经网络的手写数字识别

一.BP神经网络原理及结构

本部分先介绍神经网络基本单元神经元的结构和作用,再主要介绍BP神经网络的结构和原理。

1.神经元

  神经元作为神经网络的基本单元,对于外界输入具有简单的反应能力,在数学上表征为简单的函数映射。如下图是一个神经元的基本结构,

                    

                            神经元结构

图中是神经元的输入,是神经元输入的权重,是神经元的激活函数,y是神经元的输出,其函数映射关系为

激活函数来描述层与层输出之间的关系,从而模拟各层神经元之间的交互反应。激活函数必须满足处处可导的条件。常用的神经元函数有四种,分别是线性函数、指示函数、Sigmoid函数(S型函数)、径向基函数RBF(Radial Basis Function)。本次仿真使用Sigmoid函数,其表达式为

          

其导数为

其相应的曲线如图2-2

图2-2 Sigmoid函数

2.BP神经网络

BP神经网络是前向多层神经网络(Multilayer Feedforward Neural Network, MLFN),其

每一层包含若干个神经元,同一层的神经元之间没有互相联系,层间信息的传送只沿一个方向进行。主要包括输入层、隐含层和输出层,其中隐含层的数目随精确度的要求而有所变化。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。建立模型之后,就可以通过减少输出误差来训练网络中的参数,从而逼近正确的函数模型。

  BP神经网络主要分为信号的正向传播和误差反向传播两个过程,正向传播是指在样本数据输入后,计算输入层到隐含层,再到输出层的数据;误差反向传播就是将输出误差以某种形式通过隐含层向输入层逐层反传,将误差分摊给各层的单元,再使用梯度下降法修正各单元的权值。一般当网络输出的误差减少到可接受的程度或者进行到预先设定的学习次数时,训练结束。

  这里以下图2-2简单的三层BP神经网络为例:

图2-2三层BP神经网络

假设输入层有n个神经元,隐含层有p个神经元,输出层有q个神经元。定义变量:

  输入向量:

  隐含层的输入向量:

  隐含层的输出向量:

  输出层的输入:

  输出层的输出:

  期望输出向量:

  输入层与隐含层的连接权值:

  

  隐含层与输出成的连接权值:

  

  样本数据个数:

  输出误差函数:

  前向传播计算与误差反向传播具体步骤:

第一步:会对网络进行初始化,对各连接权值分别赋一个区间(-1,1)内的随机数,设定误差函数e,给定计算精度值和最大学习次数M。

第二步:随机选取第k个输入样本及对应的期望输出

    

    

第三步:计算隐含层各神经元的输入和输出

第四步:利用网络期望输出和实际输出,计算误差函数对输出层的各神经元的偏导数

第五步:利用输出层各神经元的

第六步:计算全局误差

第七步:当第六步计算得到的全局误差小于可接受的程度,或训练进行到预先设定的学习次数时,训练结束。

通过上述的前向传播计算与误差反向传播,BP神经网络就可以实现对样本数据的有监督训练,得到可以实现数字图像识别的逼近函数以及必要的参数。

3.MATLAB仿真及结果

本次BP神经网络数字图像识别使用MATLAB语言进行数值仿真,在进行BP神经网络

创建之前,首选需要进行数字图像的hash特征提取。获得样本图像的hash特征之后,在进行BP神经网络的创建、训练和测试。

特征提取

图像的特征对于图像的标识有着非常大的重要性,好的特征能够大大提高图像的识别率。

本次MATLAB仿真提取数字图像hash特征,具体步骤如下:

图3-1 Hash特征提取步骤图

参数训练

  将数字图像的hash特征作为网络的输入数据,按照第二节BP神经网络原理建立BP神经网络,定义各变量并设置各参数,再按照前向传播计算和误差反向传播的原理计算各层的值并迭代更新输入层和隐含层之间的权矩阵、隐含层和输出层之间的权矩阵。知道计算的全局误差小于允许误差或者训练达到预定次数。

参数测试

  将测试图像的hash特征作为网络输入数据,计算输出,判断正确与否,并统计测试识别率。

仿真结果

  由于BP神经网络的输入数据是的64维输入特征,故输入层神经元个数为65(加上偏置神经元),输出层神经元个数为10(只有一个位置输出为1,其他位置输出为0),设置的允许误差为0.000001,训练样本数为60000,测试样本数为10000,隐含层神经元个数在三次实验中分别为43、101、11个,相应的训练及测试实验结果如下。


输入层


隐含层


输出层


允许误差


输出全局误差


训练次数


识别率


65


43


10


0.000001


6.014958e-07


40816


92.9%


65


101


10


0.000001


3.678565e-07


34499


92.0%


65


11


10


0.000001


1.349866e-02


60000


89.95%

表3-1BP神经网络仿真表格

(b)识别率图

图3-2 BP神经网络测试识别率图

附件为本次"基于BP神经网络的数字图像识别"的MATLAB程序,主要分为两个函数,GetFeature函数提取图像的hash特征,BpDigitsRecog函数创建、训练BP神经网络,并进行测试。训练样本数据和标签可在网盘http://pan.baidu.com/s/1bn4h0gZ下载。

提取特征:

%2015.4.13 by anchor
%This function is to get hash feature of an image
clc;clear all;close
inputs = load(‘mnist_train.mat‘);
inputs = inputs.mnist_train;
 [sample_n] = size( inputs,1);
  for input_n = 1:sample_n
      hash_feature = inputs(input_n,:);
      image = reshape(hash_feature,28,28);
      [x,y]=find(image~=0);
      image=image(min(x):max(x),min(y):max(y));
      image = imresize(image,[8 8]);
      hash_features(input_n,:) = image(:)‘;
  end
  save train_hash hash_features
  clear hash_features
  inputs = load(‘mnist_test.mat‘);
  inputs = inputs.mnist_test;
  [sample_n] = size( inputs,1);
  for input_n = 1:sample_n
      hash_feature = inputs(input_n,:);
      image = reshape(hash_feature,28,28);
      [x,y]=find(image~=0);
      image=image(min(x):max(x),min(y):max(y));
      image = imresize(image,[8 8]);
      hash_features(input_n,:) = image(:)‘;
  end
  save test_hash hash_features

BP主程序:

 1 %2015.4.25 by anchor
 2 % ============= Part 1: Input Images And Get Hash Features ===============
 3 %This function GetFeature is to get hash feature of 28*28 image
 4                  %function GetFeatures
 5 %%=================== Part 2: Create BPNN And Train it=====================
 6 clc;clear all;
 7 inputs = load(‘train_hash.mat‘);
 8 inputs = inputs.hash_features/256;
 9 class = load(‘mnist_train_labels.mat‘);
10 class = class.mnist_train_labels;
11 [length_input,feture_length]=size(inputs);
12 num_hide=10;
13 weight_input_hide=0.0001*(rand(feture_length,num_hide));
14 weight_hide_output=0.0001*(rand(num_hide,10));
15 input_hide_offset = ones(num_hide,1);
16 hide_out_offset = ones(10,1);
17 [email protected];               %%%a need to be modulate
18 fun_out=@sigmf;
19 learn_rate=0.3;
20 allow_error = 0.000001;
21 ideal_out_list = eye(10);
22 for input_n=1:length_input                           %show the progress once trained 2000 images
23 %         ======Multilayer Feedforward Neural Network(MLFN)======
24     input = inputs(input_n,:)‘;
25     ideal_out = ideal_out_list(1:10,class(input_n)+1);
26     hide_input = weight_input_hide‘*input+input_hide_offset;
27     hide_output = fun_hide(hide_input,[1 0]);
28     out_input = weight_hide_output‘*hide_output+hide_out_offset;
29     out_out = fun_out(out_input,[1,0]);
30     out_err = 1/2*sum((ideal_out-out_out).^2);
31 %        ======Back Propagation of Errot to modulate weight======
32     out_delta=(ideal_out-out_out).*out_out.*(1-out_out); %%%the derived function need to be modulate
33     hide_out_offset =hide_out_offset + learn_rate*out_delta;
34     hide_delta = weight_hide_output*out_delta.*hide_output.*(1-hide_output);
35     weight_hide_output = weight_hide_output+learn_rate*hide_output*out_delta‘;%update weight_hide_output
36     weight_input_hide = weight_input_hide+learn_rate*input*hide_delta‘;%update weight_hide_output
37     input_hide_offset = input_hide_offset + learn_rate*hide_delta;
38    if out_err<=allow_error
39      break;
40    end
41 end
42 fprintf(‘The error  is %d ,the iteration is %d\n‘,out_err,input_n);
43 save weight_input_hide weight_input_hide
44 save weight_hide_output weight_hide_output
45 % ======================== Part 3: Test The BPNN===========================
46 inputs = load(‘test_hash.mat‘);
47 inputs = inputs.hash_features/256;
48 class = load(‘mnist_test_labels.mat‘);
49 class = class.mnist_test_labels;
50 [length_input,feture_length]=size(inputs);
51 correct = 0;
52 corrct_rate = zeros(1,length_input);
53 %   ======Multilayer Feedforward Neural Network(MLFN)======
54 for input_n=1:length_input
55     input = inputs(input_n,:)‘;
56     ideal_out = class(input_n)+1;
57     hide_input = weight_input_hide‘*input+input_hide_offset;
58     hide_output = fun_hide(hide_input,[1 0]);
59     out_input = weight_hide_output‘*hide_output+hide_out_offset;
60     out_out = fun_out(out_input,[1,0]);
61     similar = sum((repmat(out_out,1,10)-ideal_out_list).^2);
62     output = find(similar == min(similar));
63     if output == ideal_out
64         correct =correct +1;
65     end
66     corrct_rate(input_n) = correct/input_n;
67 end
68 hold on;
69 plot(corrct_rate,‘y‘)
70 xlabel(‘test number‘);
71 ylabel(‘corrct rate‘);
72 fprintf(‘The recognition rate of test is %f%% \n‘,corrct_rate(input_n)*100);
时间: 2024-10-14 08:13:56

基于BP神经网络的手写数字识别的相关文章

BP神经网络(手写数字识别)

1实验环境 实验环境:CPU [email protected],内存8G,windows10 64位操作系统 实现语言:python 实验数据:Mnist数据集 程序使用的数据库是mnist手写数字数据库,数据库有两个版本,一个是别人做好的.mat格式,训练数据有60000条,每条是一个784维的向量,是一张28*28图片按从上到下从左到右向量化后的结果,60000条数据是随机的.测试数据有10000条.另一个版本是图片版的,按0~9把训练集和测试集分为10个文件夹.这里选取.mat格式的数据

【机器学习】BP神经网络实现手写数字识别

最近用python写了一个实现手写数字识别的BP神经网络,BP的推导到处都是,但是一动手才知道,会理论推导跟实现它是两回事.关于BP神经网络的实现网上有一些代码,可惜或多或少都有各种问题,在下手写了一份,连带着一些关于性能的分析也写在下面,希望对大家有所帮助. 本博文不含理论推导,如对BP的理论推导感兴趣百度即可,或参考<模式识别>. 一.数据库 程序使用的数据库是mnist手写数字数据库,这个数据库我有两个版本,一个是别人做好的.mat格式,训练数据有60000条,每条是一个784维的向量,

第二节,TensorFlow 使用前馈神经网络实现手写数字识别

一 感知器      感知器学习笔记:https://blog.csdn.net/liyuanbhu/article/details/51622695      感知器(Perceptron)是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1.这种算法的局限性很大: 只能将数据分为 2 类 数据必须是线性可分的 虽然有这些局限,但是感知器是 ANN 和 SVM 的基础,理解了感知器的原理,对学习ANN 和 SVM 会有帮助,所以还是值得花些时间的. 感知器可以表示为

神经网络用于手写数字识别

一:人工神经网络 人类之所以能够思考,学习,判断,大部分都要归功于人脑中复杂的神经网络.虽然现在人脑的机理还没有完全破译,但是人脑中神经元之间的连接,信息的传递都已为人所知晓.于是人们就想能否模拟人脑的功能用于解决其他问题,这就发展出人工神经网络. 人工神经网络(artificial neural network,缩写ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统

简单的神经网络算法-手写数字识别

本文通过BP神经网络实现一个简单的手写识别系统. 一.基础知识 1环境 python2.7 需要numpy等库 可利用sudo apt-get install python-安装 2神经网络原理 http://www.hankcs.com/ml/back-propagation-neural-network.html 讲的特别清楚,本实验过程中涉及矩阵运算都用numpy库的函数 3.js的基础知识 http://www.w3school.com.cn/tags/html_ref_canvas.a

TensorFlow(九):卷积神经网络实现手写数字识别以及可视化

上代码: import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('MNIST_data',one_hot=True) #每个批次的大小 batch_size = 100 #计算一共有多少个批次 n_batch = mnist.train.num_examples // batch_size #参数概要 def vari

基于多层感知机的手写数字识别(Tensorflow实现)

import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data import os mnist = input_data.read_data_sets('MNIST_data', one_hot=True) class MNISTModel(object): def __init__(self, lr, batch_size, iter_num): self

Andrew Ng 机器学习课程笔记 ———— 通过初步的神经网络实现手写数字的识别(尽力去向量化实现)

上一篇我总结了自己在学完逻辑回归后,实现了对手写数字的初步识别 , 在学完了Andrew教授的神经网络简易教程后,趁着知识刚学完没多久,记下了自己在运用简易神经网络实现手写数字识别过程中的总结和问题 ^_^  菜鸡QP的第二篇学习笔记 ~ 错误在所难免 ,希望自己可以通过一篇篇菜鸡的笔记心得 ,取得一点点的进步 ~\(≧▽≦)/~    ) 依旧是给定 5000个20 * 20像素点的手写数字图片 ,与前几天自己完成的逻辑回归完成任务不同 ,这次自己终于要用到极富魅力的神经网络啦(虽然只是最基础

基于Numpy的神经网络+手写数字识别

基于Numpy的神经网络+手写数字识别 本文代码来自Tariq Rashid所著<Python神经网络编程> 代码分为三个部分,框架如下所示: # neural network class definition class neuralNetwork: # initialise the neural network def __init__(): pass # train the neural network def train(): pass # query the neural netwo