文章在对BP神经网络基本原理研究的基础上提出了利用BP神经网络方法来实现手写数字识别的方案。通过MATLAB仿真实验表明基于BP神经网络的数字识别系统取得了良好效果。手写数字识别模式识别BP神经网络中图分类号,数字识别前景广阔广泛应用于表格中数字的识别、汽车牌照的数字自动识别和成绩单的识别等项目涉及到交通、银行、教育和邮政等领域。实现数字的自动识别给人们提供了很大的方便。
数字识别的算法较多当前运用较好的主流算法以统计、神经网络和聚类分析的识别算法为主如Bagging算法、Adaboost算法、误差反向传播算法、支持向量机算法、自组织映射以及径向基函数等等。
人工神经网络的基本特征为非线性映射、学习分类和实时优化因此它为模式识别、非线性分类等研究开辟了新的途径。BP神经网络是一种典型的人工神经网络有着广泛的应用。本文利用BP神经网络进行手写数字识别系统的研究。

一.BP模型
1.1 BP神经网络
1.1.1 BP神经网络介绍
在BP神经网络中,单个样本有个输入,有个输出,在输入层和输出层之间通常还有若干个隐含层。实际上,1989年Robert Hecht-Nielsen证明了对于任何闭区间内的一个连续函数都可以用一个隐含层的BP网
络来逼近,这就是万能逼近定理。所以一个三层的BP网络就可以完成任意的维到维的映射。即这三层分
别是输入层(I),隐含层(H),输出层(O)。如下图示
MATLAB手写识别

1.1.2 隐含层的选取
在BP神经网络中,输入层和输出层的节点个数都是确定的,而隐含层节点个数不确定,那么应该设置为多少
才合适呢?实际上,隐含层节点个数的多少对神经网络的性能是有影响的,有一个经验公式可以确定隐含层
节点数目,如下
MATLAB手写识别
其中为隐含层节点数目,为输入层节点数目,为输出层节点数目,为之间的调节常数。

1.1.3 BP算法
BP算法即误差反向传播(Back Propagation)算法,其主要思想是是把学习过程分为两个阶段:第一阶段(正向传播过程),给出输入信息通过输入层经隐含层处理并计算每个单元的实际输出值;第二阶段(反向过程),若在输出层未能得到期望的输出值,则逐层递归地计算实际输出与期望输出之差值(即误差),以便根据此差值调节权值。
BP算法的基本步骤如下:
1)设置初始权值W(0)为较小的随机非零值。
2)给定输入/输出样本集合,MATLAB手写识别
误差指标
MATLAB手写识别
总误差指标
MATLAB手写识别
重复下列过程直至满足收敛条件(MATLAB手写识别
a)对于任意一个样本p,计算
正向过程 MATLAB手写识别
反向过程 MATLAB手写识别
b)修正权值MATLAB手写识别
包括两种学习方式:
模式(Pattern)学习方式:
MATLAB手写识别

训练(Epoch)学习方式:
MATLAB手写识别

1.1.4 本文运用的BP神经网络结构

MATLAB手写识别

二.BP模型识别思想
1.2.1图解
MATLAB手写识别

1.2.2输入实例

MATLAB手写识别

本文采用逐像素特征提取的方法提取数字样本的特征向量。将像素点RGB值之和大于255的像素点,特征值设为1,反之设为0。归一化的图像生成一个28x28的布尔矩阵,依次取每列元素,转化为784x1的列矩阵,作为输入图像的特征向量。

1.2.3模型训练与模型识别

MATLAB手写识别

1.2.4样本描述

受训练样本限制,本文仅对0,1,2,3,4这5个数字进行识别。每个数字对应训练样本与测试样本数量如下表
MATLAB手写识别

三.模型评估
该测试系统的设计开发可以完全满足对ABS性能准确、快速、有效检测的要求。
ABS试验台测试系统与试验台的机械台架部分相结合对ABS进行动态模拟实验通过上述的制动试验证明了所开发的ABS系统制动效能有效性同时也可以进一步对ABS不同控制逻辑和算法进行对比深化研究完善其制动效果的优化改进。
四.程序

1.主函数clc;
clear all;
close all;
%% 读取图像
root=‘C:\Users\Administrator\Desktop\data’;
img=read_train(root);
%% 提取特征
img_feature=feature_lattice(img);
%% 构造标签
class=10;
numberpclass=500;
ann_label=zeros(class,numberpclassclass);
ann_data=img_feature;
for i=1:class
for j=numberpclass
(i-1)+1:numberpclass*i
ann_label(i,j)=1;
end
end

%% 选定训练集和测试集
k=rand(1,numberpclassclass);
[m,n]=sort(k);
ntraindata=4500;
ntestdata=500;
train_data=ann_data(:,n(1:ntraindata));
test_data=ann_data(:,n(ntraindata+1:numberpclass
class));
train_label=ann_label(:,n(1:ntraindata));
test_label=ann_label(:,n(ntraindata+1:numberpclass*class));
%% BP神经网络创建,训练和测试
net=network_train(train_data,train_label);
predict_label=network_test(test_data,net);
%% 正确率计算
[u,v]=find(test_label1);
label=u’;
error=label-predict_label;
accuracy=size(find(error
0),2)/size(label,2)

  1. feature_lattice
    function feature = feature_lattice(img)
    % 输入:黑底白字的二值图像。输出:35维的网格特征
    % ==提取特征,转成57的特征矢量,把图像中每1010的点进行划分相加,进行相加成一个点=%
    %==即统计每个小区域中图像象素所占百分比作为特征数据%
    for i=1:length(img);
    bw2=im2bw(img{i},graythresh(img{i}));
    bw_7050=imresize(bw2,[70,50]);
    for cnt=1:7
    for cnt2=1:5
    Atemp=sum(bw_7050(((cnt10-9):(cnt10)),((cnt210-9):(cnt210))));%10*10box
    lett((cnt-1)*5+cnt2)=sum(Atemp);
    end
    end
    lett=((100-lett)/100);
    lett=lett’;
    feature(:,i)=lett;
    end
    3.network_test
    function out = network_test(test_data,net)
    % 输入:测试数据的特征和真值。输出:测试数据的label以及误差图
    % BP网络预测

an=sim(net,test_data);
for i=1:length(test_data)
out(i)=find(an(:,i)==max(an(:,i)));
end

end

4.network_train
function net = network_train(train_data,train_label )
% 输入:训练图像特征和label。输出:训练好的神经网络

% BP网络训练
% 初始化网络结构
layer=25;
net=newff(train_data,train_label,layer);
net.trainParam.epochs=1;
net.trainParam.lr=0.1;
net.trainParam.goal=0.001;
net.trainFcn=‘trainrp’;
% 网络训练
net=train(net,train_data,train_label);
end

5.read_train
function [imglist] = read_train(root)
% ni为读取图片张数,n为文件夹数目
%读取文件夹%
out_Files = dir(root);%展开
tempind=0;
imglist=cell(0);
n=length(out_Files);
%读取文件%
for i = 1:n;
if strcmp(out_Files(i).name,’.’)|| strcmp(out_Files(i).name,’…’)
else
rootpath=strcat(root,’/’,out_Files(i).name);
in_filelist=dir(rootpath);
ni=length(in_filelist);
for j=1:ni
if strcmp(in_filelist(j).name,’.’)|| strcmp(in_filelist(j).name,’…’)|| strcmp(in_filelist(j).name,‘Desktop_1.ini’)|| strcmp(in_filelist(j).name,‘Desktop_2.ini’)
else
tempind=tempind+1;
imglist{tempind}=imread(strcat(rootpath,’/’,in_filelist(j).name));
end
end
end
end
end

相关文章: