简朴手写体数字识别系统
当前位置:以往代写 > C/C++ 教程 >简朴手写体数字识别系统
2019-06-13

简朴手写体数字识别系统

简朴手写体数字识别系统

副标题#e#

摘要

为了实现敌手写字体的识别,运用了人工智能的分层神经网络思想,对识此外字体通过练习进修,到达识别手写字体的成果。

要害字 VC,人工智能,神经网络,手写识别。

1 引言

1.1 编写目标

人工智能英文名暗示是"Artificial Intelligence",简称 AI,也就是用计较机模仿人的思维和常识,通过对本系统的进修开拓,对计较机人工智能和神经网络有了劈头的认识,萌发初学者对人工智能和网络神经进修的根基要领和思路。

1.2 配景

今朝市面上的语音识别系统和手写识别,指纹识别系统多半成立在人工智能的神经网络技能的基本上,神经网络技能是办理识别系统困难的适当要领。

2 必备常识

2.1 vc基本

本系统回收vc开拓,所以但愿读者对vc也要熟悉。

2.2神经网络

下面我们来对神经网络技能有个概略的认识,

这里说的神经网络,实质上是指人工神经网络,是模仿生物神经元的实现,神经网络又分单层神经网络(不带输入层),和多层神经网络,尝试证明,神经网络的的层数几多不影响网络对实体的识别,大概有人会问,为什么还需要多层神经网络的开拓呢?谜底是,适当的多层布局可以使网络的练习进修进度提高,可以更快地收敛到需要的权值上,但层数越多,可能层数不多都不敷以证明可以或许越快地收敛到需要的权值上,这里的研究不属于我们的领域,我们这里回收的使分层前向神经网络,布局图如下(图1)

简单手写体数字识别系统


#p#副标题#e#

3.算法

3.1.算法思想

(1)界面方面:这里我们先来熟悉一下算法的思想,为了使措施跟用户有交换界面,我们必需提供一个给用户输入的终端,这里我们用鼠标取代手写,并绘制一个输入终端用于提取我们的输入,首先子类化一个静态控件,并给重绘重载,在内里绘制控件的配景(白色),和网格线(淡青色),通过矩阵的信息举办点的重绘,响应鼠标事件,用来绘制终端的点。

(2)神经网络:我们这里回收了10×10的网格布局,为了是算法清晰易见,所以输入回收100个输入,事实上用到的点没有那么多,用户可以按照需要变动,中间的隐层回收5个输入,因为我们只是识别数字,所以只是有10个输出就足够了,(其实不消10个输出也可以完成任务,1010就可以标识10了,可以只要四位,可是照旧那句话,为了算法清晰易见),所以神经网络的布局是100:5:10.可以通过改变源代码的define来改变网络拓扑布局。

#p#副标题#e#

3.2 算法描写

(1)进修

设输入层为n个输入,隐层是m个输入,输出层是p个输出

1.初始化V,W,α,ε //给V,W赋初值,这里用随机值,有履历的话可以给V和W

//赋一个近似的初值,这样的话可以加速收敛速度。

// 是进修因子,可以按照进修的进度来动态改变,这里自始

//至终取0.7, 是精度系数,

2.轮回进修直到误差小于精度

e=(I,T) //对每一个样本取样放到荟萃e中 ,I代表输入样本,T代表输出样板

求a[j]=g(in[j])=g(简单手写体数字识别系统//求隐层的值,个中V是各个权值的向量,

//I是样板值

o[i]=g(in[i])=g(简单手写体数字识别系统//求输出层的值,个中W是各个隐层输入的

//权值,a[j]是输入的隐层的值

Err[i]=T[i]-O[i] (1<=i<=p) //Err是误差值
求 Δ[i]=Err[i]*g`(in[i])   (1<=i<=p)  //g`(in[i])是g(in[i])函数的求导
W[j,i]=W[j,i]+ *a[j]*Err[i]*g`(in[i])   //权值调解,即练习进修, 是进修因子,用
                      //来反应进修的频率,可以本身按照措施需要来定

这里碰着一个困难是隐层的误差值怎么求,因为输出层有精确的输出值作参考,所以可以或许求到误差值,可是隐层没有相应的精确值。我们可以调查输出层的误差值,这个值其实蕴涵了隐层的误差值地址,颠末证明可以用下面公式获取误差值。

Err[j]= //Err(1<=j<=P)是输出层的误差,这里
//操作这个误差蕴涵的信息来获取隐
//层的误差
V[k,j]=V[k,j]+ *I[k]*Err[j]*g`(in[j]) //隐层权值批改

#p#副标题#e#

3.返回V,W,进修完成

大概有些人不大白函数g(x)是如何选取,按照我们识此外特性来看,我们应该选择,S型函数(关于函数的范例请参阅其他书籍),思量函数的导数在内,应该选择一个较量好导的函数。所以我们选择。

y=f(A)=1/(1+Exp(-A))
y`=f`(A)=y(1-y)

(2)实现识别

1.获取输入层的各个值 a

a[j]=g(in[j])=g(简单手写体数字识别系统 把P改成m //求隐层的值,个中V是各个权值

//的向量,

o[i]=g(in[i])=g(简单手写体数字识别系统 //求输出层的值,个中W是各个隐层输入的

Err[i]=(T[i]-O[i])2 /2
// 为精度,假如全局误差都小于精度就//证明输出的矩阵O是正当的。

简单手写体数字识别系统// ε为精度,假如全局误差都小于精度就//证明输出的矩阵O是正当的。

3.3算法实现

设输入层为n个输入,隐层是m个输入,输出层是p个输出。

*这里是一次练习的算法,措施可以按照本身需要实现。

#p#分页标题#e#

INPUT W,V,P,A        //输入权值W,V,精度P,和进修系数A
INPUT i[1],...,i[n],t[1],...,t[p]   //输入和输出样板集
Step 1 Set v_sum=0.      //设定累加器
Step 2 Set in_i[m],in_j[p]   
Step 3 For j=1,...,m do Step 4 and Step 5,Step 7
Step 4  Set in_j[j]=0;    //初始化
Step 5 For k=1,...,n do Step6 and Step7
Step 6  Set in_j[j]=a[j]+(v[k,j]*i[k]);
Step 7 Set a[j]=1/(1-Exp(-in_j[j]));

Step 8 For i=1,...,p do Step9 and Step 10,Step 12
Step 9 Set in_i[i]=0;
Step 10 For j=1,...,m do Step 11
Step 11  Set in_i[i]=in_i[i]+(w[j,i]*a[j])
Step 12 Set o[i]=1/(1-Exp(-in_i[i]);
Step 13 For i=1,...,p do Step 14
Step 14 Set Err[i]=t[i]-o[i]   //误差
Step 15 For j=1,...,m do Step 16
Step 16 For i=1,...,p do Step 17
Step 17  Set w[j,i]=w[j,i]+A*a[j]*Err[i]* 1/(1-Exp(-in_j[j]))(1-1/(1-Exp(-in_j[j])));//输出层权
//值批改
Step 18 For k=1,...,n do Step 19
Step 19 For j=1,...,m do Step 20
Step 20  Set v[k,j]=v[k,j]*A*i[k]*Err[j]* 1/(1-Exp(-in_j[j]))(1-1/(1-Exp(-in_j[j])));//隐层权值
//批改
Step 21 OUTPUT (Err[1],...,Err[p])
STOP

反复练习进程来瞄精确权值的收敛,识别进程是进修进程的一部门,所以这里不再反复

#p#副标题#e#

3.4 终端处理惩罚位置居中

要使识别系统可以或许处理惩罚同一个输入终端可是有坐标偏移的问题,要作一些坐标转换,就是先获取中点坐标,然后按照中点坐标的偏移来平移,留意,这里的平移,包罗样本,和输入层的点都要作平移。详细实现请拜见附件的源代码

#p#副标题#e#

4.实现结果

采样结果

简单手写体数字识别系统

练习后的识别结果

简单手写体数字识别系统

5.总结

通过敌手写数字识别系统的开拓,熟悉了人工神经网络的根基事情方法,神经网络有许多种,每一种都有本身的特点和成果,人工神经网络还可以拓展到其他规模,我国的人工智能研究起步较量迟,还需要很大的尽力才气跟上其他发家国度的程度。

    关键字:

在线提交作业