当前位置:文档之家› 数字识别的主要算法

数字识别的主要算法

BP神经网络识别手写数字
1.图像的预处理
对手写数字图像样本灰度化处理,二值化处理,归一化调整等预处理。

其中二值化处理利用greythresh函数得到图像的全局阈值,然后使用im2bw将灰度图像转换为二值图像。

Ibw = im2bw(I1,greythresh(I1));
--Ibw为二值化图像的存储矩阵。

bw2 = edu_imgcrop(Ibw);
%找到图像边界
[y2temp x2temp] = size(bw);
x1=1;
y1=1;
x2=x2temp;
y2=y2temp;
% 找左边空白
cntB=1;
while (sum(bw(:,cntB))==y2temp)
x1=x1+1;
cntB=cntB+1;
end
% 左边
cntB=1;
while (sum(bw(cntB,:))==x2temp)
y1=y1+1;
cntB=cntB+1;
end
% 上边
cntB=x2temp;
while (sum(bw(:,cntB))==y2temp)
x2=x2-1;
cntB=cntB-1;
end
% 下边
cntB=y2temp;
while (sum(bw(cntB,:))==x2temp)
y2=y2-1;
cntB=cntB-1;
end
bw2=imcrop(bw,[x1,y1,(x2-x1),(y2-y1)]);
--对图像进行裁剪,使边框完全贴近字符。

归一化处理将图片归一化为28×28像素点阵图。

2.特征提取
将经过预处理的后的数字图像中提取最能体现这个字符特点的特征向量,然后提取出训练样本中的特征向量带入BP网络中就可以对网络进行训练。

可以采用逐像素特征提取方法提取数字样本的特征向量。

归一化后的图像形成一个28
28 的布尔矩阵,依次取每列的元素转化为784×1的列矩阵,及数字字符的特征向量。

还可以对每幅单个手写体图像进行边缘裁剪后,将裁减后的二值图像
转换成5*7即35维的特征向量,转换过程如下:
bw_7050=imresize(bw2,[70,50]);
for cnt=1:7
for cnt2=1:5
Atemp=sum(bw_7050(((cnt*10-9):(cnt*10)),((cnt2*10-9):(cnt2*10))));%10*10b ox
lett((cnt-1)*5+cnt2)=sum(Atemp);
end
end
lett=((100-lett)/100);
lett=lett';
3.BP 神经网络
BP 神经网络是一个典型的多层神经网络,它包含了输入层,隐藏层和输出层,隐层可以有一层或多层,每层上的神经元称为节点或单元,它们由可修定的权值(w )互连,除了连接输入单元,每个单元还连接一个偏置(b)。

3.1 输入层神经元个数的确定
将数字图像的特征向量作为神经网络的输入,所以神经网络的输入层神经元个数等于特征向量的维数,即28×28=784个输入神经元。

要识别10个数字,所以输出选择为10×1的矩阵,即输出节点数为10,输入为0时,第一个神经元为1,其他为0,;输入数字为1时,第二个神经元为1,其他为0;以此类推。

3.2 隐含层数和神经元个数的确定
隐含层数越多,神经网络的学习速度越慢,所以选3层神经网络。

隐含层神经元的个数是根据网络收敛性能的好坏来确定的,在总结大量网络结构的基础上,得到经验公式:s=51.035.077.054.212.043.02+++++m n m nm ,其中,n 为输入层神经元个数,m 为输出层神经元个数,可得隐含层神经元个数为15。

3.3 BP 神经网络构造
BP 算法由两部分组成:信息的正向传递与误差的反向传播。

在正向传递中,
输入信息从输入层经隐含层逐层计算传向输出层,每一层神经元的状态只影响下一层神经元的状态。

如果在输出层没有得到期望的输出则计算输出层的误差变化值,然后转向反向传播,通过网络将误差信号沿原来的连接通路反向修改各层神经元的权值直到达到期望目标。

BP 算法属于有监督的学习算法:根据训练样本和期望输出设置合适的权值,不断调整网络连接的权值,使误差达到实际的要求。

网络结构初始化:(784,15,10),innum=784,midnum=15,outnum=10; 权值初始化:
w1=rands(midnum,innum);····· 输入层到隐含层
b1=rands(midnum,1);
W2=rands(midnum,outnum);·······隐含层到输出层
b2=rands(outnum,1);
输出函数:()x y y =
网络预测输出:y(x)=input_train(:,i)
隐含层输出:y ’=∑--+j j j b x w 11
输出层的输出:()b2`2,+⨯=y w x h b w
梯度下降算法
反向传播学习规则是基于梯度下降算法的,梯度下降算法是利用梯度下降的方向迭代寻找目标函数的参数的最优值,就是向着减少误差的方向调整。

学习效率为η。

损失函数:()()()2,||||21,x h x y b w C b w x
-≡∑
求偏导:22
11v v c v v c c ∆∂∂+∆∂∂≈∆ 梯度向量:T v c v c c ⎪⎪⎭⎫ ⎝⎛∂∂∂∂≡∇21
, c v ∇-=∆η c v v ∇-=η, 所以,k
k k w c w w ∂∂-=η, l l l b c b b ∂∂-=η,
主要的matlab 代码:
Innum=785;
Midnum=15;
Outnum=10;
w1=rands(midnum,innum);
b1=rands(midnum,1);
W2=rands(midnum,outnum);
b2=rands(outnum,1);
W2_1=w2;w2_2=w2_1;
W1_1=w2;w1_2=w1_1;
B1_1=b1;b1_2=b1_1;
b2_1=b2;b2_2=b2_1;
%学习率
xite=0.1;
alfa=0.01;
%% 网络训练
for i=1:1:4500
%% 网络预测输出
x=input_train(:,i);
% 隐含层输出
for j=1:1:midnum
I(j)=input_train(:,i)'*w1(j,:)'+b1(j);
Iout(j)=1/(1+exp(double(-I(j))));
end
% 输出层输出
yn=w2'*Iout'+b2;
%% 权值阀值修正
%计算误差
e=output_train(:,i)-yn;
%计算权值变化率
dw2=e*Iout;
db2=e';
%=======由于采用的是sigmoid单元,所以要对每个输出单元以及隐藏单元计算误差项======%
for j=1:1:midnum
S=1/(1+exp(double(-I(j))));
FI(j)=S*(1-S);
end
for k=1:1:innum
for j=1:1:midnum
dw1(k,j)=FI(j)*x(k)*(w2(j,:)*e);% db1(j)=FI(j)*(w2(j,:)*e);
end
end
w1=w1_1+xite*dw1';
b1=b1_1+xite*db1';
w2=w2_1+xite*dw2';
b2=b2_1+xite*db2';
w1_2=w1_1;w1_1=w1;
w2_2=w2_1;w2_1=w2;
b1_2=b1_1;b1_1=b1;
b2_2=b2_1;b2_1=b2;
End
4.BP神经网络的测试。

相关主题