程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 簡單手寫體數字識別系統

簡單手寫體數字識別系統

編輯:關於C++

摘要

為了實現對手寫字體的識別,運用了人工智能的分層神經網絡思想,對識別的字體通過訓練學習,達到識別手寫字體的功能。

關鍵字 VC,人工智能,神經網絡,手寫識別。

1 引言

1.1 編寫目的

人工智能英文名表示是"Artificial Intelligence",簡稱 AI,也就是用計算機模擬人的思維和知識,通過對本系統的學習開發,對計算機人工智能和神經網絡有了初步的認識,萌發初學者對人工智能和網絡神經學習的基本方法和思路。

1.2 背景

目前市面上的語音識別系統和手寫識別,指紋識別系統大都建立在人工智能的神經網絡技術的基礎上,神經網絡技術是解決識別系統難題的適當方法。

2 必備知識

2.1 vc基礎

本系統采用vc開發,所以希望讀者對vc也要熟悉。

2.2神經網絡

下面我們來對神經網絡技術有個大體的認識,

這裡說的神經網絡,實質上是指人工神經網絡,是模擬生物神經元的實現,神經網絡又分單層神經網絡(不帶輸入層),和多層神經網絡,實驗證明,神經網絡的的層數多少不影響網絡對實體的識別,可能有人會問,為什麼還需要多層神經網絡的開發呢?答案是,適當的多層結構可以使網絡的訓練學習進度提高,可以更快地收斂到需要的權值上,但層數越多,或者層數不多都不足以證明能夠越快地收斂到需要的權值上,這裡的研究不屬於我們的范疇,我們這裡采用的使分層前向神經網絡,結構圖如下(圖1)

3.算法

3.1.算法思想

(1)界面方面:這裡我們先來熟悉一下算法的思想,為了使程序跟用戶有交流界面,我們必須提供一個給用戶輸入的終端,這裡我們用鼠標代替手寫,並繪制一個輸入終端用於提取我們的輸入,首先子類化一個靜態控件,並給重繪重載,在裡面繪制控件的背景(白色),和網格線(淡青色),通過矩陣的信息進行點的重繪,響應鼠標事件,用來繪制終端的點。

(2)神經網絡:我們這裡采用了10×10的網格結構,為了是算法清晰易見,所以輸入采用100個輸入,事實上用到的點沒有那麼多,用戶可以根據需要更改,中間的隱層采用5個輸入,因為我們只是識別數字,所以只是有10個輸出就足夠了,(其實不用10個輸出也可以完成任務,1010就可以標識10了,可以只要四位,但是還是那句話,為了算法清晰易見),所以神經網絡的結構是100:5:10.可以通過改變源代碼的define來改變網絡拓撲結構。

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]) //隱層權值修正

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個輸出。

*這裡是一次訓練的算法,程序可以根據自己需要實現。

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

重復訓練過程來對准確權值的收斂,識別過程是學習過程的一部分,所以這裡不再重復

3.4 終端處理位置居中

要使識別系統能夠處理同一個輸入終端但是有坐標偏移的問題,要作一些坐標轉換,就是先獲取中點坐標,然後根據中點坐標的偏移來平移,注意,這裡的平移,包括樣本,和輸入層的點都要作平移。具體實現請參見附件的源代碼

4.實現效果

采樣效果

訓練後的識別效果

5.總結

通過對手寫數字識別系統的開發,熟悉了人工神經網絡的基本工作方式,神經網絡有很多種,每一種都有自己的特點和功能,人工神經網絡還可以拓展到其他領域,我國的人工智能研究起步比較遲,還需要很大的努力才能跟上其他發達國家的水平。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved