实验四 手写数字识别的神经网络算法设计与实现

实验四 手写数字识别的神经网络算法设计与实现

一、实验目的

通过学习BP神经网络技术,对手写数字进行识别,基于结构的识别法及模板匹配法来提高识别率。

二、实验器材

PC机 matlab软件

三、实验内容

按照BP神经网络设计方法选用两层BP网络,构造训练样本集,并构成训练所需的输入矢量和目标向量,通过画图工具,获得数字原始图像,截取图像像素为0的最大矩形区域,经过集合变换,变成16*16的二值图像,再进行反色处理,其图像数据特征提取为神经网络的输入向量。通过实验证实,BP神经网络应用于手写数字识别具有较高的识别率和可靠性。

四、实验原理

BP算法由数据流的前向计算(正向传播)和误差信号的反向传播两个过程构成. 正向传播时,传播方向为输入层→隐层→输出层,每层神经元的状态只影响下一层神经元. 若在输出层得不到期望的输出,则转向误差信号的反向传播流程. 通过这两个过程的交替进行,在权向量空间执行误差函数梯度下降策略,动态迭代搜索一组权向量,使网络误差函数达到最小值,从而完成信息提取和记忆过程.

五、实验步骤

1、首先对手写数字图像进行预处理,包括二值化、去噪、倾斜校正、归一化和特征提取,生成BP神经网络的输入向量m和目标向量target. 其中m选取40×10的矩阵,第1列到第10列代表0~9的数字.target为9×10的单位矩阵,每个数字在其所排顺序位置输出1,其他位置输出0.
2、然后神经网络的训练过程是识别字符的基础,直接关系到识别率的高低。输送训练样本至BP神经网络训练, 在梯度方向上反复调整权值使网络平方和误差最小。学习方法采用最速下降方法,输入结点数为16*16=256,隐层传输函数为sigmoid函数(logsig),一个输出结点,输出传输函数为pureline(purelin),隐层结点数为sqrt(256+1)+a(a=1~10),取为25。训练完毕, 把待识别数字送BP神经网络中进行仿真测试。
分析运行结果

六、实验具体过程

clear all;
'正在生成输入向量和目标向量,请稍等...'
for kk=0:99
    p1=ones(16,16);
    m=strcat(int2str(kk),'.bmp');
    x=imread(m,'bmp');
    bw=im2bw(x,0.5);
    [i,j]=find(bw==0);
    imin=min(i);
    imax=max(i);
    jmin=min(j);
    jmax=max(j);
    bwl=bw(imin:imax,jmin:jmax);
    rate=16/max(size(bwl));
    bwl=imresize(bwl,rate); [i,j]=size(bwl);
i1=round((16-i)/2);
 j1=round((16-j)/2);
 p1(i1+1:i1+i,j1+1:j1+j)=bwl;
 p1=-1.*p1+ones(16,16);
 %以图象数据形成神经网络输入向量
 for m=0:15
p(m*16+1:(m+1)*16,kk+1)=p1(1:16,m+1);
 end
 %形成神经网络目标向量
 switch kk
   case{0,10,20,30,40,50,60,70,80,90}
             t(kk+1)=0;
   case{1,11,21,31,41,51,61,71,81,91}
             t(kk+1)=1;
   case{2,12,22,32,42,52,62,72,82,92}
             t(kk+1)=2;
   case{3,13,23,33,43,53,63,73,83,93}
             t(kk+1)=3;
   case{4,14,24,34,44,54,64,74,84,94}
             t(kk+1)=4;
   case{5,15,25,35,45,55,65,75,85,95}
             t(kk+1)=5;
   case{6,16,26,36,46,56,66,76,86,96}
             t(kk+1)=6;
   case{7,17,27,37,47,57,67,77,87,97}
             t(kk+1)=7;
   case{8,18,28,38,48,58,68,78,88,98}
             t(kk+1)=8;
   case{9,19,29,39,49,59,69,79,89,99}
             t(kk+1)=9;
  end
end
save E52PT p t;
'输入向量和目标向量生成结束!'

在这里插入图片描述

%Example52Tr
clear all;
load E52PT p t;
%创建BP网络
pr(1:256,1)=0;
pr(1:256,1)=0;
pr(1:256,2)=1;
net=newff(pr,[251],{'logsig' 'purelin'},'traingdx','learngdm');
%设置训练参数和训练BP网络
net.trainParam.epochs=2500;
net.trainParam.goal=0.001;
net.trainParam.show=10;
net.trainParam.lr=0.05;
net=train(net,p,t);
%存储训练后的BP网络
save E52net net;

在这里插入图片描述

%Example52Sim
clear all;
p(1,256,1)=1;
p1=ones(16,16);
load E52net net;
test=input('Please input a test image:','s');
x=imread(test,'bmp');
bw=im2bw(x,0.5);
[i,j]=find(bw==0);
imin=min(i);
imax=max(i);
jmin=min(j);
jmax=max(j);
bw1=bw(imin:imax,jmin:jmax);
rate=16/max(size(bw1));
bw1=imresize(bw1,rate);
[i,j]=size(bw1);
i1=round((16-i)/2);
j1=round((16-j)/2);
p1(i1+1:i1+i,j1+1:j1+j)=bw1;
p1=-1.*p1+ones(16,16);
for m=0:15
   p(m*16+1:(m+1)*16,1)=p1(1:16,m+1);
end
[a,Pf,Af]=sim(net,p);
imshow(p1);
a=round(a)

在这里插入图片描述

七、实验结果分析:

如上,该程序可以很好地实现手写数字识别功能。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值