版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
摘要信息技術(shù)的快速發(fā)展,計算機(jī)迅速走進(jìn)人們的生活,手寫識別技術(shù)和應(yīng)用領(lǐng)域越來越廣泛,比如在移動設(shè)備上、文印工作中都離不開它的身影,極大的方便了人們的日程生活、工作、學(xué)習(xí),因此手寫識別具有很強(qiáng)的應(yīng)用價值和實用價值。本文中利用神經(jīng)網(wǎng)絡(luò)算法識別數(shù)字圖像和手寫漢字。識別的前提是獲得穩(wěn)定的神經(jīng)網(wǎng)路,需要通過大量的訓(xùn)練樣本進(jìn)行訓(xùn)練。針對數(shù)字圖像首先對圖像進(jìn)行處理,通過灰度化、二值化、中值濾波、梯度銳化、歸一化等算法獲得特征矩陣,然后用經(jīng)過訓(xùn)練的神經(jīng)網(wǎng)路算法識別需要識別的特偵矩陣,進(jìn)而獲得識別的結(jié)果。針對漢字識別,首先處理圖像獲得特征矩陣,通過經(jīng)過訓(xùn)練的神經(jīng)網(wǎng)絡(luò)的識別獲得筆畫,然后用筆畫去識別漢字,最后獲得識別的漢字以及聯(lián)想漢字和詞組。經(jīng)過測試和驗證,基于人工神經(jīng)網(wǎng)絡(luò)的手寫識別系統(tǒng)能夠有效識別數(shù)字手寫圖像與手寫漢字,在本文選用的一些測試文字與數(shù)字圖像的識別上獲得了不錯的結(jié)果。關(guān)鍵詞:手寫識別;圖像處理;神經(jīng)網(wǎng)絡(luò)
ABSTRACTTherapiddevelopmentofinformationtechnologymakesthecomputerimmediatelyappearinpeople'slives.Theapplicationofhandwritingrecognitiontechnologybecomeswidespread,andtherearemoreandmoreapplicationareas.Forexample,wecanseeitonamobiledeviceandintheprintingwork.Itmakespeople'sdailylife,workandlearningmoreconvenient.Therefore,thehandwritingrecognitionhasverystrongappliedvalueandpracticalvalue.Inthisarticle,thewriterusesneuralnetworktoidentifydigitalimageandhandwritingChineseideogram.Thepremiseofrecognitionistoobtainastableneuralnetworkandagreatdealofsampletrainingisneeded.Fordigitalimage,weneedtoprocesstheimages,andgetcharacteristicmatrixthroughaseriesofalgorithms,includinggraying,linearization,Medianfilter,gradientsharpeningandnormalization.ForChineseideogramrecognition,weshouldgainacharacteristicmatrixbyprocessingimages,andthengetpaintingpenthroughthetrainingneuralnetworkidentification.Next,weusepaintingpentorecognizeChineseideogram.Atlast,theChineseideogramandassociativeChinesecharactersandphraseswillbeobtained.Aftertestingandverification,handwritingrecognitionwhichisbasedonartificialneuralnetworksystemcaneffectivelyidentifythehandwritingimageandChineseideogram.Weobtainsatisfyingresultsintheidentificationtestonwordsanddigitalimage.Keywords:Handwritingrecognition;imageprocessing;neuralnetwork目錄TOC\o"1-3"\h\u5771第1章緒論 119114課題研究的背景 113321課題研究的目的及意義 120842國內(nèi)外研究現(xiàn)狀 227834課題研究內(nèi)容 2163論文的組織結(jié)構(gòu) 34813第2章神經(jīng)網(wǎng)絡(luò)算法的原理 413393神經(jīng)網(wǎng)絡(luò)的原理 4170692.1.1生物神經(jīng)元網(wǎng)絡(luò) 435962.1.2人工神經(jīng)元網(wǎng)絡(luò) 46923神經(jīng)元學(xué)習(xí)算法 628525前饋神經(jīng)網(wǎng)絡(luò) 626133感知機(jī) 613541反向傳播算法 817808神經(jīng)網(wǎng)絡(luò)在模式識別上面的優(yōu)勢 117146本章小結(jié) 1116569第3章系統(tǒng)設(shè)計與實現(xiàn) 1222501神經(jīng)網(wǎng)絡(luò)算法的實現(xiàn) 1218954神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu) 1213132算法的結(jié)構(gòu) 1217504神經(jīng)網(wǎng)絡(luò)識別手寫數(shù)字 1418121手寫數(shù)字的常規(guī)預(yù)處理方法 142576圖像的灰度化 1524161圖像的二值化 1519953中值濾波 169453去掉離散點 1611619圖像銳化 1712403數(shù)字的切分 1817369數(shù)字的歸一化 197705特征提取 1921364數(shù)字識別過程 198897神經(jīng)元規(guī)模的確定 2129613神經(jīng)網(wǎng)絡(luò)識別漢字 2123965筆畫的預(yù)處理 2232294圖像的處理 23256493.3.3神經(jīng)網(wǎng)絡(luò)規(guī)模的確定 24294563.3.4字庫的管理方式 24316483.3.5漢字的查詢 2766123.3.6聯(lián)想詞組的查詢 2820799UI界面的實現(xiàn) 292008主窗口的自繪實現(xiàn) 2921685自繪控件的實現(xiàn) 3018070本章小結(jié) 3210297第4章系統(tǒng)測試及效果分析 3323404系統(tǒng)測試 3332687神經(jīng)網(wǎng)絡(luò)算法的測試 3318112手寫數(shù)字識別的測試 3319886手寫漢字識別的測試 3632112本章小結(jié) 3721943結(jié)論 3813996參考文獻(xiàn) 3913604致謝 41第1章緒論課題研究的背景手寫識別的研究具有很大的使用價值,在過去的幾十年,由于數(shù)字化、信息化的大力發(fā)展,手寫識別成為模式識別的一個熱點。隨著、平板等電子產(chǎn)品的快速發(fā)展,手寫識別技術(shù)在這些產(chǎn)品上已經(jīng)廣泛應(yīng)用,既能夠提升這些產(chǎn)品的用戶體驗、也能提高不少的效率。與此同時,現(xiàn)實生活中存在大量的手寫、打印文件等,有的需要整理成電子文檔,如果用人力去將該文件錄入到電子設(shè)備當(dāng)中,不僅效率低而且錯誤率高,這種方法已經(jīng)不適應(yīng)當(dāng)今社會,由于現(xiàn)在電子計算機(jī)的廣泛應(yīng)用于各行各業(yè),但是由于各種各樣的原因,智能識別系統(tǒng)不能廣泛應(yīng)用于社會,極大影響了人們的生活、工作效率。人工智能有一段時間曾經(jīng)陷入低迷,大眾都認(rèn)為人工智能只是個玩具而沒有實際應(yīng)用價值。進(jìn)入21世紀(jì)以來,數(shù)學(xué)的大力發(fā)展大大推動了人工智能的進(jìn)步,也大大推動了計算機(jī)科學(xué)的發(fā)展。機(jī)器學(xué)習(xí)是人工智能的一個重要分支,也是現(xiàn)在的一個熱點。一個真正的智能,應(yīng)該具有學(xué)習(xí)能力,能夠根據(jù)自身的環(huán)境來學(xué)習(xí),并改善自身的性能,能夠自動獲取學(xué)習(xí)所需要的知識。以前的智能系統(tǒng)不具有學(xué)習(xí)能力,只是根據(jù)某些算法去計算,隨著時代的發(fā)展,這種局限表現(xiàn)的更加突出。在這種現(xiàn)象下,機(jī)器學(xué)習(xí)在很大程度上解決了這種局限。現(xiàn)在機(jī)器學(xué)習(xí)已經(jīng)應(yīng)用到各個領(lǐng)域,比如專家系統(tǒng)、語音識別、搜索、計算機(jī)視覺等。神經(jīng)網(wǎng)絡(luò)是機(jī)器學(xué)習(xí)學(xué)科中的一個重要部分,用來分類或者回歸。神經(jīng)網(wǎng)絡(luò)的發(fā)展,為手寫識別提供了一個新的途徑。課題研究的目的及意義單個神經(jīng)元的結(jié)構(gòu)簡單,但是當(dāng)大量的神經(jīng)元組成了神經(jīng)網(wǎng)絡(luò),就有了本質(zhì)的改變,它能夠模擬現(xiàn)實生活中的行為,而且每個神經(jīng)元都能處理和存儲信息,使得神經(jīng)網(wǎng)絡(luò)具有了并行計算和分布式存儲的特點。研究神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)有助于更好的從手寫字中踢出去關(guān)鍵因素,從而提高識別的準(zhǔn)確度和豐富度。研究手寫識別具有很大的應(yīng)用價值,將其應(yīng)用于現(xiàn)代便攜電子設(shè)備,豐富了人們的生活,提高工作效率。將其應(yīng)用于手寫文檔的識別,不僅能將人們從繁重重復(fù)的勞動中解脫出來,而且能夠提高手寫文檔電子化的效率。手寫識別有很重要的理論價值,人們書寫的文字種類不同,每個人的書寫習(xí)慣不同,使得識別的樣本具有豐富的多樣性,識別算法需要從不同的方面進(jìn)行研究。國內(nèi)外研究現(xiàn)狀 在20世紀(jì)20年代,西方學(xué)者就研究過字符的識別,最早的是德國人G.Tausher的閱讀機(jī),采用的比較簡單的匹配原理,能夠粗略的識別簡單的字符比如數(shù)字。到了20世紀(jì)60年代初,OCR(廣字符閱讀機(jī))已經(jīng)能夠識別書寫比較公正的手寫體字符了,比如日本的Toshiha公司開發(fā)的郵政編碼自動分揀機(jī)。到了近代,人工智能的發(fā)展,神經(jīng)網(wǎng)絡(luò)走入了人們的視線,它具有眾多優(yōu)點,能夠有效利用樣本的特點進(jìn)行學(xué)習(xí),然后根據(jù)學(xué)習(xí)的結(jié)果識別手寫字符[1]。由于漢字的基數(shù)大、寫法復(fù)雜、字體繁多,識別起來難點很大,所以漢字的識別被認(rèn)為是字符識別領(lǐng)域的最終目標(biāo),很多人投入了大量的精力,也取得了很大的成就[2]。漢字的識別最開始始于1966年,IBM公司的Casey和Nagy首次發(fā)表了漢字識別的文章。國內(nèi)的漢字識別技術(shù)始于20世紀(jì)70年代,當(dāng)時是聯(lián)機(jī)手寫識別技術(shù),經(jīng)過長時間的摸索之后,劉迎健等人于1988年提出了利用筆段作為基元來進(jìn)行聯(lián)機(jī)的手寫漢字識別,識別的漢字能夠達(dá)到6763-12000字,已經(jīng)具有了一定的實用價值?,F(xiàn)在的手寫識別技術(shù)較上個世紀(jì),已經(jīng)有了長足的進(jìn)步,識別范圍能夠支持GB2312-80規(guī)定的6763個簡體字,對于書寫規(guī)范的漢字,識別率能夠達(dá)到95%以上[3,4]。課題研究內(nèi)容本課題研究的是一個基于神經(jīng)網(wǎng)絡(luò)的手寫識別系統(tǒng)。系統(tǒng)由C++語言開發(fā)完成,負(fù)責(zé)神經(jīng)網(wǎng)絡(luò)前饋網(wǎng)絡(luò)、反饋神經(jīng)網(wǎng)絡(luò)、界面的設(shè)計、圖形的處理、圖形的識別、字庫管理程序的設(shè)計,手寫識別系統(tǒng)包括神經(jīng)網(wǎng)絡(luò)算法的設(shè)計。系統(tǒng)研究的是基于神經(jīng)網(wǎng)絡(luò)的手寫識別,包括數(shù)字與漢字的識別。數(shù)字與漢字的識別方法不一樣,數(shù)字比較簡單,數(shù)量只有10個,漢字較為復(fù)雜,數(shù)量大,所以針對這兩種模型采用了不同的思路。本文首先從理論上介紹了神經(jīng)網(wǎng)絡(luò)算法,然后介紹了數(shù)字的識別方法、漢字的手寫識別方法。數(shù)字的識別能夠識別兩種模式的數(shù)字,第1種是直接通過手寫工具寫在手寫板上的數(shù)字,通過神經(jīng)網(wǎng)絡(luò)的分類,得出書寫的結(jié)果;第2種是加載含有噪聲的數(shù)字,首先通過計算機(jī)圖形學(xué)的知識降噪,然后通過神經(jīng)網(wǎng)絡(luò)分類得出結(jié)果。漢字的識別是將漢字拆分成元字根,本系統(tǒng)根據(jù)筆尖的走向,判斷出書寫的筆劃,然后通過筆劃來判斷漢字。論文的組織結(jié)構(gòu)本文共分為4章,按如下方式組織:第1章是全文的緒論部分,介紹了系統(tǒng)開發(fā)的背景,系統(tǒng)的研究的目的和意義,國內(nèi)外的研究現(xiàn)狀,課題的研究內(nèi)容,系統(tǒng)的預(yù)期效果和關(guān)鍵指標(biāo)以及本文的組織結(jié)構(gòu)。第2章是神經(jīng)網(wǎng)絡(luò)算法的介紹,這部分詳細(xì)介紹了神經(jīng)網(wǎng)絡(luò)算法,然后介紹了神經(jīng)網(wǎng)絡(luò)中的BP神經(jīng)網(wǎng)絡(luò)算法。第3章是手寫識別的基本過程,這部分介紹了神經(jīng)網(wǎng)絡(luò)的實現(xiàn)、對圖形的處理、特征向量的提取、以及漢字和數(shù)字的手寫識別過程,以及用戶界面的實現(xiàn)過程。第4章是介紹了系統(tǒng)的測試部分,這部分主要介紹了手寫識別系統(tǒng)的三個部分的測試。最后是結(jié)論部分,對全文進(jìn)行了全面的總結(jié)。第2章神經(jīng)網(wǎng)絡(luò)算法的原理人工神經(jīng)網(wǎng)絡(luò)(ArtificialNeuralNetwork,ANN)由大量的神經(jīng)元組成,結(jié)構(gòu)與腦神經(jīng)組織相似,是對生物神經(jīng)元的模擬,能夠完成與生物神經(jīng)元網(wǎng)絡(luò)類似的功能。神經(jīng)網(wǎng)絡(luò)的原理2.1.1生物神經(jīng)元網(wǎng)絡(luò)人腦的神經(jīng)系統(tǒng)的基本組成單位是神經(jīng)細(xì)胞,人腦組織的神經(jīng)系統(tǒng)大約由1011個神經(jīng)元細(xì)胞組成,而每個神經(jīng)細(xì)胞大于與104個神經(jīng)細(xì)胞相連接,通過大量的神經(jīng)細(xì)胞的活動,完成人神經(jīng)系統(tǒng)的活動。在神經(jīng)系統(tǒng)中,有的能力是先天就有的,比如呼吸,有的能力是后天訓(xùn)練完成的,比如說話。神經(jīng)元細(xì)胞之間的連接通過突觸來完成,其中突觸分為軸突和樹突。神經(jīng)元細(xì)胞之間信息的傳遞通過生物電來完成,當(dāng)神經(jīng)元細(xì)胞產(chǎn)生一個興奮的信號時,神經(jīng)細(xì)胞的膜電位就會產(chǎn)生變化,通過脈沖的方式傳遞給其他神經(jīng)元細(xì)胞。通過樹突->胞體->軸突->神經(jīng)連接->其他細(xì)胞,這樣就興奮信號傳遞了出去。2.1.2人工神經(jīng)元網(wǎng)絡(luò)人工神經(jīng)元網(wǎng)絡(luò)模擬生物神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)見圖2.1。圖2.1人工神經(jīng)元的基本模型圖2.1中,X表示神經(jīng)元的輸入,相當(dāng)于其他神經(jīng)元的輸出值,w表示權(quán)重(weight),f是一個非線性函數(shù),神經(jīng)元的動作如下:當(dāng)f為閾值函數(shù)的時候,其輸出為:為了使式子簡約,先設(shè)閾值則或可以選取sgn函數(shù)作為閾值函數(shù)如果要求學(xué)習(xí)算法的輸出函數(shù)可微,可以選用sigmoid函數(shù),即:sigmoid函數(shù)的函數(shù)圖像見圖2.2。圖2.2sigmoid函數(shù)Sigmoid函數(shù)是無限次可微、連續(xù)、有界、關(guān)與原點對稱的函數(shù),抑制兩頭,對中間的細(xì)微變化敏感,使得神經(jīng)網(wǎng)絡(luò)對特征的識別度更好。神經(jīng)元學(xué)習(xí)算法前饋神經(jīng)網(wǎng)絡(luò)前饋神經(jīng)網(wǎng)絡(luò)是一個接受前一級輸入,并且輸出到下一級的結(jié)構(gòu),沒有反饋結(jié)構(gòu),每一個神經(jīng)元可以有多個輸入,但是只有一個輸出,每一個神經(jīng)元的輸出可以作為任意多個其他節(jié)點的輸入。前饋神經(jīng)網(wǎng)絡(luò)可以分成不同的層,第n層的輸入只與第n-1層的輸出有關(guān)。通常將所有的神經(jīng)元層分成三層,即:輸入層、輸出層、隱含層,輸入層即神經(jīng)元網(wǎng)絡(luò)的第一層,負(fù)責(zé)從外部接受輸入數(shù)據(jù),最后一層為輸出層,輸出整個神經(jīng)元網(wǎng)絡(luò)的結(jié)果,輸入層與輸出層之間的全部是隱含層,隱含層的層數(shù)目可以大于等于1層。前饋神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)示意圖見圖2.3。圖2.3前饋神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)示意圖感知機(jī)感知機(jī)是一種雙層的神經(jīng)元網(wǎng)絡(luò)模型,沒有輸出層,有輸入層,是一層計算單元。感知機(jī)學(xué)習(xí)的目的是將訓(xùn)練數(shù)據(jù)進(jìn)行超平面的線性劃分,感知機(jī)模型首先導(dǎo)入了誤分類的損失函數(shù),然后利用梯度下降法對損失函數(shù)小化。感知機(jī)的模型如下:其中x為輸入向量,sgn是上面介紹過的符號函數(shù),是權(quán)值向量,為偏置向量,要求出感知機(jī)的模型,只需要求出和即可。假設(shè)訓(xùn)練數(shù)據(jù)集是超平面線性可分的,感知機(jī)的目的就是求的一個合適的和,將訓(xùn)練集中的正例和負(fù)例完全區(qū)分開來。選擇誤分類點到分類超平面S的總距離位損失函數(shù),即:其中,為輸入空間任意一點,為的L2范數(shù)。對于誤分類點來說,當(dāng),=-1,當(dāng)時,=1。故:所以誤分類點到分類超平面S的距離是:假設(shè)所有誤分類點的集合為M,那么所有誤分類點到分類超平面S的距離是:那么最終的損失函數(shù)為: 現(xiàn)在的問題就是選取最小的損失函數(shù)模型的和感知機(jī)求解算法:采用隨機(jī)梯度下降,首先任意選取一個超平面,,然后用梯度下降法不斷極小化(1)式子。極小化的過程中隨機(jī)一個誤差分類點進(jìn)行梯度下降。分別對(1)式中的和求偏導(dǎo),即:隨機(jī)選取一個誤分類點,對和,則有:其中,為步長。然后不停地進(jìn)行梯度下降算法,直到訓(xùn)練集總沒有誤分類點為止。這種算法的思路是:當(dāng)一個點被誤分類的時候,就重新進(jìn)行梯度下降,調(diào)整和,使得分類平面往誤分類的一側(cè)移動,減少該點與分類超平面的距離,直到該點被正確的分類,然后再次選取點重復(fù)上述方法,直到所有的點都被正確分類,那么就找到了正確的和。反向傳播算法感知機(jī)作為最簡單的前向人工神經(jīng)網(wǎng)絡(luò)算法,雖然結(jié)構(gòu)簡單,但是能解決復(fù)雜的問題,但是感知機(jī)的本質(zhì)缺陷是不能處理線性不可分問題。前饋神經(jīng)網(wǎng)絡(luò)中隱含層無法與外界相連,無法計算誤差,為了解決這一問題,提出了反向傳播網(wǎng)絡(luò)(BP,Back-Propogation)算法[6],算法主要思想為:首先通過前饋神經(jīng)網(wǎng)絡(luò)得出神經(jīng)網(wǎng)絡(luò)的值,然后計算該值與訓(xùn)練集中值的誤差,然后簡介算出隱含層的誤差,然后調(diào)整參數(shù),再次計算誤差,直到誤差小到可以接受的范圍。在反向傳播算法中,通常采用梯度下降法來修正權(quán)值,從感知機(jī)的求解過程中,可知輸出函數(shù)要求可微,故通常采用sigmoid函數(shù)作為輸出函數(shù)。當(dāng)研究某一層時,j表示該層的第j個神經(jīng)元,i表示前一層的第i個神經(jīng)元,k表示后一層的第k個神經(jīng)元,表示該層第j個神經(jīng)元的輸出,表示前一層第i個神經(jīng)元與本層第j個神經(jīng)元之間的權(quán)值。計算某一層的輸出值:對于輸出層來說,實際輸出值與理想輸出值之間存在誤差,誤差為:其中為理想的輸出值,是實際輸出值。誤差E對權(quán)值求偏導(dǎo)數(shù),得:其中為局部梯度:采用梯度下降法對誤差進(jìn)行調(diào)整,得到每次的調(diào)整量為:如果節(jié)點j是輸出層,那么神經(jīng)元輸出值即為,那么:如果節(jié)點j是隱含層,那么神經(jīng)元的輸出值需要用sigmoid函數(shù)處理,即:由于隱含層的每一個節(jié)點對后面的節(jié)點都由影響,可以得出:在反向傳播過程中,為了加快算法的收斂速度,會在權(quán)值修正量中加上前一次的權(quán)值修正量,即慣性項:綜上所述,反向傳播算法步驟如下:(1)隨機(jī)初始權(quán)系數(shù)初始值。(2)首先執(zhí)行神經(jīng)網(wǎng)絡(luò)的前向傳播過程,計算各層單元:(3)然后計算輸出層的局部梯度:(4)然后計算各個隱含層額局部梯度,方向從后向前。(5)得出神經(jīng)元之間的權(quán)值修正量:(6)修改權(quán)值:(7)重復(fù)2-6過程,直到算法收斂。采用反向傳播算法能有效解決隱含層的權(quán)值修正問題,通過不斷的計算輸出層的誤差,然后通過梯度下降法調(diào)整輸出層的前一層神經(jīng)元的權(quán)值,然后再循環(huán)調(diào)整所有的隱含層的權(quán)值,直到整個算法收斂。但是采用反向傳播算法有可能會陷入到局部最小點,而不是收斂到全局最小點,因為算法采用的是梯度下降算法來求解非線性函數(shù)的極值,梯度下降法不具有全局觀念。反向傳播算法中有兩個重要的參數(shù),和,即步長和慣性系數(shù)。步長直接影響到算法的收斂性,如果該值較大,沿著梯度下降的幅度大,但是對極小值出的處理不好,如果該值較小,沿著梯度下降的幅度小,但是收斂速度慢,影響算法的效率。慣性項系數(shù)影響收斂速度,可以在0.9-1之間選擇。在實際應(yīng)用反向傳播算法的過程中,還需要好注意一些問題:(1)樣本的處理,由于傳入神經(jīng)元的數(shù)據(jù)可能會是各種各樣的值,由于采用sigmoid函數(shù),所以數(shù)據(jù)需要進(jìn)行歸一化處理,可以歸一化到(0,1)或者(-1,1)之間。針對樣本的輸出,從sigmoid函數(shù)可以得知,如果要輸出0,1,那么值需要是無重大或者無窮小,故需要進(jìn)行處理,可以認(rèn)為輸入大于0.5即為1,小于。(2)網(wǎng)絡(luò)結(jié)構(gòu)的選擇。反饋神經(jīng)網(wǎng)絡(luò)的隱含層層數(shù)和神經(jīng)元數(shù)目的確定,對算法有著至關(guān)重要的作用,它們決定了神經(jīng)網(wǎng)絡(luò)的規(guī)模,如果規(guī)模大,計算量就會大,而且可能會導(dǎo)致神經(jīng)網(wǎng)絡(luò)擬合的函數(shù)過度追求擬合擬合效果,反而失去了原本的特性,即過擬合,如果規(guī)模小,計算量小,但是可能會導(dǎo)致神經(jīng)網(wǎng)絡(luò)擬合的函數(shù)不能很好的擬合所有的數(shù)據(jù),即欠擬合。(3)初始權(quán)值、閾值的選擇。初始值對學(xué)習(xí)結(jié)果也是有影響的,選擇一個適當(dāng)?shù)某跏贾的鼙M快收斂,而且保證擬合的效果好。(4)批量學(xué)習(xí)和增量學(xué)習(xí)。批量學(xué)習(xí)適用于離線學(xué)習(xí),即一次性輸入所有的學(xué)習(xí)樣本,然后去學(xué)習(xí)。批量學(xué)習(xí)的優(yōu)點是學(xué)習(xí)效果比較穩(wěn)定,擬合出的函數(shù)性能比較好,但是缺點是一次需要所有的學(xué)習(xí)樣本;增量學(xué)習(xí)適用于在線學(xué)習(xí),即動態(tài)獲取學(xué)習(xí)樣本,然后輸入神經(jīng)網(wǎng)絡(luò)進(jìn)行學(xué)習(xí),然后再次獲取學(xué)習(xí)樣本,再次學(xué)習(xí)。這種學(xué)習(xí)方法對噪聲比較敏感,不適合劇烈變化的輸入模式,但是可以在原有網(wǎng)絡(luò)的基礎(chǔ)上直接學(xué)習(xí)。神經(jīng)網(wǎng)絡(luò)在模式識別上面的優(yōu)勢1、神經(jīng)網(wǎng)絡(luò)能夠分布式的存儲信息神經(jīng)網(wǎng)絡(luò)是利用多個神經(jīng)元之間的連接以及各個神經(jīng)元之間的權(quán)值來表示信息,每個神經(jīng)元都能夠單獨的存儲信息,所以它能夠分布式存儲信息,而且如果網(wǎng)絡(luò)部分受到損害,也能夠恢復(fù)原來信息。2、神經(jīng)網(wǎng)絡(luò)能夠并行處理信息神經(jīng)網(wǎng)絡(luò)中的每個神經(jīng)元都可以接受信息,然后獨立運算和處理,然后將運算的結(jié)果輸出來,這些步驟都是可以并行的。3、神經(jīng)網(wǎng)絡(luò)能夠自動學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)模擬了生物神經(jīng)系統(tǒng)的結(jié)構(gòu),能夠根據(jù)外界的環(huán)境來調(diào)節(jié)內(nèi)部的信息,從而去適應(yīng)外界的環(huán)境,通過對參數(shù)分類,使得網(wǎng)絡(luò)收斂來符合當(dāng)前的環(huán)境。本章小結(jié)本章詳細(xì)介紹了神經(jīng)網(wǎng)絡(luò)算法,以及其基本組成部分:感知機(jī)、前饋神經(jīng)網(wǎng)絡(luò)、反向神經(jīng)網(wǎng)絡(luò)。利用嚴(yán)格的公式論證了該算法,并且說明了算法的一些特點以及注意事項,在最后講述了神經(jīng)網(wǎng)絡(luò)在模式識別中的優(yōu)勢。第3章系統(tǒng)設(shè)計與實現(xiàn)本章首先介紹了神經(jīng)算法的實現(xiàn),接著詳細(xì)介紹了手寫數(shù)字的實現(xiàn)、手寫漢字的實現(xiàn),最后介紹了UI界面的實現(xiàn)。神經(jīng)網(wǎng)絡(luò)算法的實現(xiàn)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)一個完整的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)包括:輸入層、輸出層、隱含層、隱含層權(quán)重、輸出層權(quán)重、輸出層誤差、隱含層誤差等結(jié)構(gòu)。具體的數(shù)據(jù)結(jié)構(gòu)如下:double* pInputLayer; //輸出層數(shù)據(jù)double* pHiddenLayer; //隱含層數(shù)據(jù)double* pOutputLayer; //輸出層數(shù)據(jù)double** pWeightHidden; //隱含層權(quán)重double** pWeightOutput; //輸出層權(quán)重double* pErrOutput; //輸出層誤差double* pErrHidden; //隱含層誤差double** pLastChangeHidden; //上次隱含層改變值double** pLastChangeOutput; //上次輸出層改變值bool bRegression; //是否回歸double dRate1; //學(xué)習(xí)率double dRate2; //慣性項系數(shù)int iInputCount; //輸入層神經(jīng)元個數(shù)int iHiddenCount; //隱含層神經(jīng)元個數(shù)int iOuputCount; //輸出層神經(jīng)元個數(shù)算法的結(jié)構(gòu)用代碼實現(xiàn)神經(jīng)網(wǎng)絡(luò)算法,主要步驟分為五個部分,初始化神經(jīng)網(wǎng)絡(luò)、加載神經(jīng)網(wǎng)絡(luò)參數(shù)、前向神經(jīng)網(wǎng)絡(luò)、反向神經(jīng)網(wǎng)絡(luò)、學(xué)習(xí)過程。1、初始化神經(jīng)網(wǎng)絡(luò)首先通過Initializer函數(shù)傳入神經(jīng)網(wǎng)絡(luò)需要的各個參數(shù),然后通過這些參數(shù),給神經(jīng)網(wǎng)絡(luò)分配內(nèi)存。2、加載神經(jīng)網(wǎng)絡(luò)參數(shù)由于學(xué)習(xí)樣本的龐大,每次學(xué)習(xí)的耗時很長,所以預(yù)先將已經(jīng)學(xué)習(xí)好的參數(shù)保存在文件當(dāng)中,當(dāng)初始化好神經(jīng)網(wǎng)絡(luò)之后,就開始加載神經(jīng)網(wǎng)絡(luò)里面的參數(shù)。3、前向神經(jīng)網(wǎng)絡(luò)算法的步驟如下:(1)將訓(xùn)練的input數(shù)據(jù)輸入到神經(jīng)網(wǎng)絡(luò)的輸入層。(2)。(3)計算隱含層的每一個神經(jīng)元的值,然后通過sigmoid函數(shù)將計算得的值賦值給當(dāng)前神經(jīng)元。(4)。(5)計算輸出層的每一個神經(jīng)元的值,根據(jù)是否回歸來選擇使用采用sigmoid函數(shù)來處理計算所得值。4、反向神經(jīng)網(wǎng)絡(luò)算法的步驟如下:(1)計算輸出層的誤差。(2)根據(jù)1中計算得誤差,計算輸出層的局部梯度。(3)根據(jù)局部梯度與上次輸出層的改變值、學(xué)習(xí)率等參數(shù)改變輸出層權(quán)重。(4)計算隱含層的誤差。(5)根據(jù)4中計算得誤差,計算隱含層的局部梯度。(6)根據(jù)隱含層的局部梯度與上次隱含層的改變值、學(xué)習(xí)率等參數(shù)改變隱含層權(quán)重。5、學(xué)習(xí)過程算法的步驟如下:(1)檢查參數(shù)有效性。(2)將輸入的input數(shù)據(jù)順序打亂。(3)對input數(shù)據(jù)的每一組訓(xùn)練數(shù)據(jù),作如下訓(xùn)練:(1)前向網(wǎng)絡(luò)計算隱含層與輸出層神經(jīng)元的值。(2)反饋網(wǎng)絡(luò)調(diào)整隱含層與輸出層神經(jīng)元的值以及權(quán)值。神經(jīng)網(wǎng)絡(luò)識別手寫數(shù)字在識別手寫數(shù)字的過程中,會碰到很多種情況,使用不同的方法,會得到不同的結(jié)果,具體過程見圖3.1。圖3.1識別數(shù)字的步驟手寫數(shù)字的常規(guī)預(yù)處理方法在利用神經(jīng)網(wǎng)絡(luò)識別手寫數(shù)字的過程中,對神經(jīng)網(wǎng)絡(luò)的輸入數(shù)據(jù)有兩種表現(xiàn)方式,第1種是將數(shù)字圖像經(jīng)過數(shù)值化后直接傳入神經(jīng)網(wǎng)絡(luò)進(jìn)行學(xué)習(xí),第2種是將數(shù)字圖像經(jīng)過數(shù)值化后,再經(jīng)過預(yù)處理,再傳入神經(jīng)網(wǎng)絡(luò)進(jìn)行學(xué)習(xí)。第1種方法未經(jīng)過處理,在某些特定的環(huán)境會獲得更好的效果,但是會使得分類器的復(fù)雜程度大大增加。因此,對原本的樣本的預(yù)處理,已經(jīng)成為手寫數(shù)字識別的一個重要途徑。預(yù)處理的第一步是將數(shù)字圖像轉(zhuǎn)換成m*n的一個像素矩陣,然后經(jīng)過灰度化、二值化,然后經(jīng)過一些降噪算法,如中值濾波算法,去掉圖像的噪聲,然后再經(jīng)過梯度銳化算法銳化邊緣,最后經(jīng)過細(xì)化、平滑、規(guī)格化等處理,得到比較好的輸入數(shù)據(jù)。最后這是從樣本中提取出特征,來構(gòu)成輸入數(shù)據(jù),對于數(shù)字常見的方法有提取數(shù)字寬度、長度、粗細(xì)等特征。圖像的灰度化圖像的灰度化指去掉圖像的色彩信息,只保留圖像的亮度信息。一副圖像的一個像素點由RGB三種顏色組成,灰度圖像不再關(guān)心RGB色彩,只關(guān)心亮度。在識別過程當(dāng)中,人們只關(guān)心圖像的形狀,不關(guān)心色彩,相反,色彩由于顏色過于豐富,反而會影響識別,所以獲得像素矩陣后要將圖像灰度化。圖像的灰度化一般有4中方法,即分量法、最大值法、平均值法、加權(quán)平均法。本文中采用平均值法,即使得圖像的RGB三個分量的值相等。通過公式:這樣使得RGB三個分量的值等于三個分量的平均值,就可以得到灰度圖像?;叶葓D像是很多圖形處理的第一步,經(jīng)過圖像的灰度化之后,就可以進(jìn)行其他的處理,所以,圖像的灰度化是很重要的一個步驟。圖像的二值化圖像的二值化是指把圖像中的所有像素根據(jù)一定的方法,劃分成黑白兩種顏色。經(jīng)過二值化后的圖像,全部的像素都是0或者255,圖像會顯示出很明顯的黑白效果。這樣就不再和更多的像素有關(guān)。這樣一個像素點可以壓縮成0和1兩個數(shù),利于處理和節(jié)省空間。二值化法的基本公式是:公式中f(i,j)為圖像灰度化后的像素值,g(i,j)為圖像二值化后的值,T為閾值。從式子中可以看出,T的值直接關(guān)系到二值化的效果,根據(jù)T值得不同選取方法,可以把二值化算法分為三種,即:整體閾值法、局部閾值法、動態(tài)閾值法。整體閾值法,即整張圖像的閾值都是一個值。但是這個閾值需要根據(jù)具體的圖像來確定,曝光度高的圖像,閾值需要小一點,曝光度低的圖像,閾值需要大一點。整體閾值法的閾值一旦確定就不能更改,不能根據(jù)特定的區(qū)域來更改閾值,但是整體閾值法的算法簡單,運算速度快,適用于干擾小的圖像。這個閾值的確定方法也比較簡單,通常就計算整張圖片的亮度值,然后選取中間值作為二值化的閾值。局部閾值法,即根據(jù)不同的區(qū)域來確定不同的閾值。當(dāng)一張圖像的曝光度不均勻時,采用整體閾值法會得到不理想的二值化圖像,如果采用局部閾值法,可以根據(jù)不同區(qū)域的曝光度來確定閾值,得到一張效果良好的二值化圖像。但是采用局部閾值法,計算量大一些,速度也會慢一些。動態(tài)閾值法,即根據(jù)每個像素點的像素值和位置來確定不同的閾值。這種方法不僅考慮了單個像素點的特點,還考慮了該像素點周圍的像素點的特點,能夠很好的突出圖像的邊緣。但是在手寫數(shù)字的識別過程中,數(shù)字圖像與背景的區(qū)別較大,不需要采用這種方法來二值化,而且會降低圖像處理的速度。中值濾波圖像的噪聲指影響人們接受圖像信息的因素。噪聲在理論上是不能被預(yù)測的,只能通過概率的方法來統(tǒng)計隨機(jī)誤差。如果圖像中存在噪聲,會大大影響字符的切分、特征向量的提取等。因此圖像的降噪將直接影響到數(shù)字識別的效果。中值濾波是一種非線性的圖像平滑方法,能夠根據(jù)圖像的不同去平滑圖像,而且不會影響圖像的邊緣,具體方法可定義為:式子中,g(x,y)和f(x-i,y-i)分別為輸出和輸入像素值,W為模版窗口,可以選擇線性、方形、十字形、圓形、菱形等。取出模版窗口W中的所有像素值,然后排序,選擇這些像素值的中間值作為g(x,y)的像素值。去掉離散點在圖像中可能會存在很多孤立的點或者點區(qū)域,這些點的面積往往比較小,通過中值濾波等濾波算法可能不會被去掉,如果不去掉就會影響圖像的進(jìn)一步處理。數(shù)字圖形往往都是一個很大的聯(lián)合的整體,即相連的非空白像素點數(shù)目很大,而往往與孤立的離散點相連的非空白點數(shù)目小,因此可以根據(jù)這個去掉孤立的點區(qū)域。算法的步驟如下:(1)掃描整個圖像,找到非空白點。(2)將該空白點進(jìn)隊列。(3)從隊列中取出第一個點,然后分別求出與之相連的上下左右四個點,判斷該點是否在圖像區(qū)域內(nèi)并且沒有被搜索過。(4)如果滿足3中的要求,就將該點放入隊列,并且標(biāo)記該點已經(jīng)被檢索。(5)循環(huán)2-4過程,直到隊列為空或者被標(biāo)記的點的個數(shù)超過了一個閾值。(6)判斷被標(biāo)記的點的個數(shù)是否超過了閾值,如果沒有超過,就將這些被標(biāo)記的點置為空白點。(7)循環(huán)1-6過程,直到掃描完了所有的點。之所以采用這種算法,原因是圖像的不同,有的圖像的離散點區(qū)域比較大,采用其他的算法不能快速的將這些離散的點清理掉,這時候采用這種算法,只需要判斷閾值,就能快速將連續(xù)點小于這個閾值的離散點去掉。但是這個算法也存在缺點,如果是噪聲點貼近數(shù)字圖像,算法則不能判斷該點為噪聲點,也就不能去掉了,所以需要與其他算法配合使用才能更好的去掉噪聲。圖像銳化圖像銳化的主要目是使邊緣從圖像背景中更容易區(qū)分開來,使物體能夠更加鮮明的從圖像中區(qū)分開來,有助于后序的分割、特征提取等操作。圖像的模糊實際上是受到平均或者通過積分運算造成的,對圖像進(jìn)行微分運算,可以使圖像清晰化。本文中主要采用梯度銳化算法來銳化圖像的邊緣,首先計算各點的梯度值,定義在f(x,y)在點(x,y)處的梯度是一個矢量,定義為:其中,梯度的幅度G[f(x,y)]可以由以下公式算出:在f(x,y)在其最大變化率方向上增加的距離,叫做梯度的數(shù)值,因此,上式可以寫作:當(dāng)采用這種算法的時候,圖像的最后一行、最后一列無法計算梯度,所以可以采用前一行或者前一列的梯度值來代替。算法的步驟如下:(1)將圖像的最后一行像素點置為0xFF。(2)對除去最后一行的圖像中的每一個像素點循環(huán)。(3)取出當(dāng)前像素點值(a)、當(dāng)前像素點的左邊一個像素點(b)、當(dāng)前像素點的下邊一個像素點(c)。(4)計算梯度值abs(a-b)+abs(a-c)。(5)判斷梯度值是否大于一個閾值,如果大于該閾值,就將當(dāng)前像素點的值設(shè)置為梯度值。物體與物體、背景與背景之間的梯度變化一般都很小,只有在物體的邊緣梯度變化才會比較大,也就是物體和背景交叉的部分。當(dāng)某點的梯度值大于一個閾值的時候,就認(rèn)為該點在物體和背景的交叉邊緣,處理方法是:加上一個特定的值C,使得邊緣變亮;如果梯度值小于這個閾值,就認(rèn)為在同一個環(huán)境下,就不去改變該點的像素值。當(dāng)圖像處理完時,物體和背景的邊緣就被增量了,同時也不影響圖像的其他點。數(shù)字的切分經(jīng)過上述圖像處理的算法之后,數(shù)字圖像就比較好的被處理了出來。人們識別數(shù)字只關(guān)心數(shù)字部分,其他部分是不關(guān)心的,所以需要將數(shù)字部分從數(shù)字圖像中區(qū)分開來。經(jīng)過切分后的數(shù)字,去掉了部分背景,使得切分后的圖像剛好包含了整個數(shù)字,大大減少了對以后的圖像分析、處理所需要的數(shù)據(jù)量。算法的主要步驟如下:(1)掃描整個圖像。(2)當(dāng)循環(huán)到一個沒有被掃描過的黑色點時,就將該點放入一個隊列。(3)從隊列中取出一個點,然后計算該點的上下左右四個方向的點,判斷這些點是否在圖像內(nèi)以及是否沒有被掃描過。(4)如果滿足3中的條件,就將點放入隊列中,同時用該點的坐標(biāo)值更新區(qū)域的位置值(left、right、top、bottom)。(5)循環(huán)2-4,直到隊列為空。(6)將獲得的區(qū)域的位置值放入到一個向量中,同時循環(huán)1-6,直到掃描完整個圖像。最終切分的數(shù)字圖像的區(qū)域就在(6)中的區(qū)域位置向量中了。數(shù)字的歸一化經(jīng)過數(shù)字的切分之后,數(shù)字圖像就從背景中分離了出來,但是數(shù)字之間彼此的大小都不一樣,但是識別要求所有的數(shù)據(jù)都是一樣的尺寸,所以需要對數(shù)字進(jìn)行歸一化處理。歸一化算法一般有兩種,即線性歸一化和非線性歸一化。線性歸一化算法比較簡單,即對像素坐標(biāo)進(jìn)行線性的變換,然后把原來的字符映射到規(guī)定的區(qū)域內(nèi)。首先按照圖像現(xiàn)在的大小和要變換的大小求出變換系數(shù),然后用插值的方法把原來的像素點映射到歸一化的區(qū)域內(nèi)。需要注意的是,數(shù)字圖像有的長有的寬,需要根據(jù)不同的長和寬計算變換系數(shù)。非線性歸一化算法會考慮到原有圖像的形狀等特點,利用這些特點進(jìn)行非線性的變換,這樣歸一化后的圖像會最大化的保留以前圖像的特點。本文中采用的為線性歸一化算法,算法思路如下:(1)獲取切分后的數(shù)字區(qū)域位置(left,right,top,bottom)。(2)根據(jù)1中所得位置計算區(qū)域的width與height,如果width大于height,那么則按照width擴(kuò)展,反之,根據(jù)height擴(kuò)展。(3)計算原圖像與變換后的圖像的變換系數(shù)。(4)對數(shù)字區(qū)域中的每一個像素循環(huán),如果該像素不為空白點,那么根據(jù)變換系數(shù)以及拓展選項計算在變換后的坐標(biāo),然后將該點的值置為非空白點。特征提取特征提取是整個字符識別系統(tǒng)的關(guān)鍵,識別算法是根據(jù)選取特征的種類來進(jìn)行選擇的。系統(tǒng)識別率高低的關(guān)在是:提取的特征是否穩(wěn)定,是否代表一類字符的特點。針對數(shù)字的特征提取,可以采用比較簡單的方法,掃描得到的整個圖像,當(dāng)碰到黑色點時,就提取出1,當(dāng)碰到白色點時,就提提取出0。當(dāng)掃描完整個圖像后,就得到了一個與圖像大小一樣的特征向量矩陣。這種方法很簡單,運算速度快,但是適應(yīng)性不強(qiáng)。針對BP神經(jīng)網(wǎng)絡(luò)的特點,可以使神經(jīng)網(wǎng)絡(luò)很快收斂,如果加大訓(xùn)練樣本的數(shù)目,可以增強(qiáng)適應(yīng)性。數(shù)字識別過程首先從圖像中獲取特征向量,得到訓(xùn)練樣本,然后將特征向量輸入到神經(jīng)網(wǎng)絡(luò)中進(jìn)行訓(xùn)練,經(jīng)過一定數(shù)量的訓(xùn)練之后,就可以用該神經(jīng)網(wǎng)絡(luò)去識別數(shù)字了。數(shù)字識別的過程見表3.1。表3.1數(shù)字識別過程表樣本的準(zhǔn)備灰度化二值化中值濾波梯度銳化去掉離散點數(shù)字的切分歸一化識別的結(jié)果神經(jīng)元規(guī)模的確定1、輸入層與輸出層神經(jīng)元個數(shù)的確定輸入層和輸出層的神經(jīng)元個數(shù)應(yīng)該和具體的應(yīng)用環(huán)境有關(guān)。輸入層的神經(jīng)元數(shù)目和特征矩陣有關(guān),在本文中,采用的特征矩陣為20*20,所以輸入的神經(jīng)元數(shù)目為400個。輸出層神經(jīng)元的數(shù)目和輸出規(guī)模有關(guān),由于在數(shù)字識別中,只有0-9這10個數(shù)字,所以輸出層神經(jīng)元數(shù)目為10。同時規(guī)定,當(dāng)?shù)趲讉€神經(jīng)元輸出1時,匹配的就是幾,例如第4個神經(jīng)元輸出1,其他輸出0,那么匹配的數(shù)字就是4。2、隱含層神經(jīng)元個數(shù)的確定隱含層神經(jīng)元的個數(shù)關(guān)系到神經(jīng)網(wǎng)絡(luò)的性能,取在合適的數(shù)量能大大提升性能,如果數(shù)目過大,會出現(xiàn)過擬合情況,如果數(shù)目過小,會出現(xiàn)欠擬合情況。目前還沒有一種比較科學(xué)的方法來確定隱含層神經(jīng)元個數(shù)的方法,大多是通過經(jīng)驗以及嘗試得出數(shù)目。事實上,通過各種公式計算出來的隱含層神經(jīng)元個數(shù)不一樣,性能也相差很多倍。3、隱含層層數(shù)的確定。增加隱含層層數(shù),可以提高神經(jīng)網(wǎng)絡(luò)的精度,也可以降低整個網(wǎng)絡(luò)的誤差,同時也會增加網(wǎng)絡(luò)的復(fù)雜程度,影響網(wǎng)絡(luò)的性能,而且有可能會出現(xiàn)過擬合的情況。已經(jīng)有定理證明:若輸入層和輸出層采用線性轉(zhuǎn)換函數(shù),隱層采用Sigmoid轉(zhuǎn)換函數(shù),則含一個隱層的MLP網(wǎng)絡(luò)能夠以任意精度逼近任何有理函數(shù)[6]。根據(jù)這個理論,可以只設(shè)計包含一個隱含層的神經(jīng)元網(wǎng)絡(luò),通過適當(dāng)控制該隱含層神經(jīng)元,就可以達(dá)到多層隱含層的神經(jīng)網(wǎng)絡(luò)的效果。神經(jīng)網(wǎng)絡(luò)識別漢字相比數(shù)字,漢字的識別就復(fù)雜了不少,目前漢字的識別被認(rèn)為是最困難的模式識別問題之一。漢字是一種特殊模式的幾何,包括的種類多、結(jié)構(gòu)復(fù)雜、而且書寫的形勢多種多樣,加上其他干擾因素,都使得漢字的識別很困難。漢字的具體識別過程見圖3.2。圖3.2識別漢字的步驟筆畫的預(yù)處理漢字的識別可以拆分成筆畫,漢字的筆畫有多種,本文將漢字的筆畫基本分為以下16種,具體筆畫見表3.2。由于筆畫是直接書寫在面板上的,面板上除了白色背景就是筆畫了,所以預(yù)處理也會相對比較簡單。本文中把漢字的筆劃分成3類,第1類是除去點的15種筆劃,這15種筆畫的處理方式就是直接用神經(jīng)網(wǎng)絡(luò)來識別。第2類是點筆劃,由于點的形狀不確定,大小比較小,如果采用神經(jīng)網(wǎng)絡(luò)來識別,有很大的幾率會識別成其他筆畫或者識別不出來,所以可以用一個閾值來確定是否為點筆劃,當(dāng)獲得的筆畫大小小于一個值時,就判斷為點筆劃。第3類是類似于第1類的筆畫,比如豎鉤與豎、撇折與豎折,比較類似,可以把這幾種筆畫與第1類的進(jìn)行融合,然后都采用神經(jīng)網(wǎng)絡(luò)來識別筆畫,這樣既能保護(hù)輸出層的神經(jīng)元數(shù)目少、也能減少工作的復(fù)雜度,這對于漢字的識別是有較大的益處的。表3.2漢字筆畫表序號筆畫代表漢字1橫一、二、三2豎十3撇八、人4捺入5橫折穴6點興7豎折發(fā)、畫8橫折鉤刀、刃9臥鉤心10橫撇又11豎彎鉤兒12橫折彎鉤乙、億13豎折彎鉤與、馬14橫折提說、讓15橫折折折鉤及、乃16豎折撇專圖像的處理1、圖像的二值化針對漢字識別的二值化,就簡單很多,就是把背景點的其他點標(biāo)記為黑點,背景點標(biāo)記為白點。該本文中,筆畫采用的顏色為綠色(RGB(0,0xFF,0)),所以將非綠色點標(biāo)記為白色,綠色點標(biāo)記為黑色,就完成了二值化過程。2、圖像的歸一化在書寫漢字的過程當(dāng)中,每次書寫一次的時候,就需要提取書寫的信息,故每一次歸一化的圖像都是一次書寫的圖像。歸一化的方法也比較簡單,即對像素坐標(biāo)進(jìn)行線性的變換,然后把原來的字符映射到規(guī)定的區(qū)域內(nèi)。首先按照圖像現(xiàn)在的大小和要變換的大小求出變換系數(shù),然后用插值的方法把原來的像素點映射到歸一化的區(qū)域內(nèi)。3、特征向量的提取經(jīng)過圖像的歸一化后,得到一個m*n的像素矩陣,由于漢字的識別只關(guān)心形狀,不關(guān)心顏色,所以首先掃描整個圖像,如果碰到一個黑色像素點,把一個黑色像素點轉(zhuǎn)換成1,碰到一個白色像素點,就轉(zhuǎn)換成0,當(dāng)整張圖像轉(zhuǎn)換完成后,就得到了一個特征矩陣。3.3.3神經(jīng)網(wǎng)絡(luò)規(guī)模的確定1、輸入層與輸出層神經(jīng)元數(shù)目的確定在本文中,輸入的特征矩陣有20*20,所以輸入層神經(jīng)元數(shù)目為400,輸出層的輸出為16個筆畫,故輸出層神經(jīng)元數(shù)目為16,當(dāng)輸出一個特定的筆畫的時候,對應(yīng)的神經(jīng)元輸出為1,例如當(dāng)?shù)?個神經(jīng)元輸出為1時,輸出的筆畫為捺。2、隱含層神經(jīng)元數(shù)目的確定該本文中,輸入層神經(jīng)元數(shù)目為400,輸出層神經(jīng)元數(shù)目為16,訓(xùn)練數(shù)據(jù)在500左右,經(jīng)過多次測試,確定隱含層神經(jīng)元數(shù)目在100個,既能快速收斂,也能保證神經(jīng)網(wǎng)絡(luò)的穩(wěn)定性。3、學(xué)習(xí)率以及慣性項系數(shù)的確定為了保證神經(jīng)網(wǎng)絡(luò)算法的快速收斂,同時也保證網(wǎng)絡(luò)的穩(wěn)定,以及結(jié)合具體的情況,學(xué)習(xí)率取值0.25,慣性項系數(shù)取值0.1。經(jīng)過大量測試,性能穩(wěn)定,效果比較好。3.3.4字庫的管理方式1、漢字在外存中的存儲漢字基數(shù)過多、筆畫特征也很復(fù)雜,但是復(fù)雜的漢字與簡單的漢字的識別原理是一樣的,故選取了一些基本的漢字作為測試數(shù)據(jù),測試數(shù)據(jù)大約50個漢字。漢字在外存中的存儲,存儲的數(shù)據(jù)包括漢字以及組成該漢字的筆畫,存儲格式為文本格式。2、漢字在內(nèi)存中的存儲漢字在書寫過程中,需要實時查詢,所以對性能要求會比較高,如果直接從外存中讀取,并放在一個鏈表容器中,會導(dǎo)致效率比較低,字庫越大,體現(xiàn)的越明顯。了解到字庫的格式,即一個漢字是由多個筆畫組成的,所以在內(nèi)存中維護(hù)了一顆trie樹,trie樹的結(jié)構(gòu)見圖3.3。圖3.3trie樹的結(jié)構(gòu)Trie樹的查詢見下面的代碼部分:CWordList*CTrieTree::QueryWord(int*pStroke,intiLength){TrieNode*p=pRoot; //獲得trie樹的nil根節(jié)點for(inti=0;i<iLength;i++) //對獲得筆畫的進(jìn)行循環(huán){intiCurrentStroke=pStroke[i]; //獲取當(dāng)前筆畫if(p->pChild[iCurrentStroke]==nullptr) //判斷合法性{returnnullptr;}if(i==iLength-1) //最后的筆畫{if(p->pChild[iCurrentStroke]->pWord==nullptr) //檢查漢字的合法性{returnnullptr;}if(p->pChild[iCurrentStroke]->pWord->GetLength()!=0) //漢字個數(shù)不為0{CWordList*pRet=newCWordList; //新的漢字表intiChildWordLength=p->pChild[iCurrentStroke]->pWord->GetLength();for(intj=0;j<iChildWordLength;j++){pRet->AddWord(p->pChild[iCurrentStroke]->pWord->GetNode(j)->lpWord); //將獲得的漢字插入到漢字表中}std::queue<TrieNode*>likeNode;intiQueueSize=0;likeNode.push(p->pChild[iCurrentStroke]); //相似漢字隊列while(!likeNode.empty()){TrieNode*pFirst=likeNode.front();for(intk=0;k<TOTAL_STROKE;k++){if(pFirst->pChild[k]!=nullptr){likeNode.push(pFirst->pChild[k]);intiFirstChildWordLength=pFirst->pChild[k]->pWord->GetLength();if(iFirstChildWordLength!=0){for(intm=0;m<iFirstChildWordLength;m++){pRet->AddWord(pFirst->pChild[k]->pWord->GetNode(m)->lpWord); //插入相似漢字iQueueSize++;if(iQueueSize>10){gotoEndOfBeepSearch;}}}}}likeNode.pop();}EndOfBeepSearch:;returnpRet;}}p=p->pChild[iCurrentStroke];}returnnullptr;}trie樹的第一個節(jié)點是nil,然后每一個節(jié)點代表一個筆畫,父節(jié)點代表這個漢字的上一個筆畫是什么。由于有些漢字存在很多共同筆畫,所以公共了很多父節(jié)點。3.3.5漢字的查詢當(dāng)在書寫面上寫下“木”字,根據(jù)神經(jīng)網(wǎng)絡(luò)傳回的結(jié)果可以得知,依次書寫了:橫、豎、撇、捺。然后首先找nil節(jié)點的“橫”節(jié)點,找到之后,再找“橫”節(jié)點的“豎”節(jié)點孩子,依次內(nèi)推,再找“撇”和“捺”節(jié)點,找到之后,可以從對應(yīng)的節(jié)點找到按照這樣筆畫順序書寫的漢字。但是有很多漢字是一樣的書寫順序,比如“旮”、“旭”等,所以一個節(jié)點里面會包括多個漢字。這些漢字保存在一個鏈表容器當(dāng)中,按照需要可以全部取出來。除了當(dāng)前的漢字的查詢之外,還需要能夠查詢有當(dāng)前筆畫組成的其他漢字,比如查詢“二”,能夠提示“三”。查詢的方法包括兩種:廣度優(yōu)先搜索、深度優(yōu)先搜索。廣度優(yōu)先搜索算法是一種最基本的圖搜索算法,也叫寬度優(yōu)先搜索。算法的步驟描述如下:(1)將起始節(jié)點放入隊列尾部。(2)While(隊列不為空)(3) 取得并刪除隊列首節(jié)點Node。(4) 處理該節(jié)點Node。(5) 把Node的未處理相鄰節(jié)點加入隊列尾部。使用該算法注意的問題:采用廣度優(yōu)先搜索,先搜索同樣父節(jié)點的所有子節(jié)點,然后在搜索某一子節(jié)點下的所有節(jié)點,這樣搜索的優(yōu)勢是,能夠優(yōu)先搜索出同一筆畫下的所有漢字。深度優(yōu)先搜索算法也是一種最基本的圖搜索算法。算法的步驟描述為:(1)初始化棧。(2)輸出起始節(jié)點,并標(biāo)記為已訪問,將該節(jié)點壓入棧。(3)While(棧不為空)(4) 取得棧頂節(jié)點Top,注意不要從棧內(nèi)刪除。(5) 遍歷棧頂節(jié)點Top的相鄰節(jié)點A。if(該節(jié)點A未被標(biāo)記為已訪問)then輸出節(jié)點A,標(biāo)記A為已訪問,把A壓入棧。if(沒有滿足條件的相鄰節(jié)點A)then棧頂節(jié)點Top出棧。(7)重復(fù)3-6,直到??铡2捎蒙疃葍?yōu)先搜索,這樣搜索能夠按照一條線路搜索所有的漢字。3.3.6聯(lián)想詞組的查詢聯(lián)想詞組是當(dāng)搜索某一個漢字的時候,就給出由該漢字組成的一個詞組,例如當(dāng)輸入“一”的時候,就會給出“一個”、“一把”等詞組。1、聯(lián)想詞組在外存中的存儲方式聯(lián)想詞組包括了詞組以及該詞組的熱度,詞組的熱度指該詞組的在日常輸入過程中出現(xiàn)的次數(shù),存儲以文本文件的方式存儲。2、聯(lián)想詞組在內(nèi)存中的存儲方式聯(lián)想詞組的數(shù)量很龐大,常用的大于有近四萬多條詞組,聯(lián)想詞組的查詢會在每一次查詢漢字的時候確定,所以查詢的頻度會很高,怎么去管理聯(lián)想詞組就成為一個很重要的問題。根據(jù)漢字的編碼特點,即一個漢字占用兩個字節(jié),就將這兩個字節(jié)算作一個整數(shù),然后針對整數(shù)排序。排序規(guī)則如下:(1)先把整個整數(shù)數(shù)組按照第一個數(shù)的大小排序。(2)如果第一個數(shù)的大小相同,就按照第二個數(shù)的大小排序。(3)如果第二個數(shù)相同,就按照第三個數(shù)的大小排序,依次類推。排序完成之后,查找詞組就方便了許多,排序算法可以采用快速排序、歸并排序等。當(dāng)查找某一個漢字的聯(lián)想詞組時,先采用二分查找,從整個數(shù)組中找到一個詞組所在的位置,算法復(fù)雜度為O(logn),然后分別向前向后查找所有第一個漢字為該漢字的詞組,記下詞組在數(shù)組中的前后位置,那么這兩個位置中間所有的詞組就是第一個漢字為該漢字的所有詞組。接下來就是找出這些詞組中熱度最高的N個詞組,可以采用以下幾種方法:(1)將所有的按照熱度排序,然后取出熱度最高的N個詞組,復(fù)雜度為O(n*logn)。這種方法雖然算法簡單,但是復(fù)雜度太高,用在此處不合適。(2)采用TopK算法,復(fù)雜度為O(n*logK)。TopK算法的基礎(chǔ)是一個基于小頂堆的優(yōu)先隊列,堆的大小維持在K,算法主要步驟如下:當(dāng)判斷一個新的詞組的時候:(1)如果堆的大小小于K,就將該詞組插入到堆中。(2)如果堆的大小為K,那么先拿出堆頂?shù)囊粋€詞組,比較新的詞組與堆頂詞組,如果新詞組的熱度小于堆頂詞組的熱度,就略過該詞組。如果新詞組的熱度大于堆頂詞組的熱度,那么就把堆頂詞組從堆中刪除掉,然后把新的詞組插入到堆中。這樣就能利用僅僅K個空間,以及O(n*logK)的復(fù)雜度就遍歷了整個數(shù)組,能大大提升聯(lián)想詞組的查詢速度。UI界面的實現(xiàn)主窗口的自繪實現(xiàn)識別的UI界面采用DirectUI方式自繪而成,渲染引擎采用GDI+。GDI+是GDI(GraphicsDeviceInterface)的升級版,相比GDI,能夠處理更多的圖片格式(png、jpg、gif、tiff),也包含了更多的GDI元素,例如漸變畫刷、抗鋸齒處理、圖像變換能力、圖像處理等。處理通過普通的窗口處WM_NCCREATE、WM_NCPAINT、WM_NCCALCSIZE、WM_ERASE、WM_NCHITTEST等消息,得到一個沒有標(biāo)題欄和邊框的空白界面,然后通過響應(yīng)系統(tǒng)的刷新消息WM_PAINT,用GDI+在界面上自繪控件完成主窗口。自繪控件的實現(xiàn)1、BasicControl控件實現(xiàn)BasicControl類負(fù)責(zé)封裝控件的基本屬性,如控件大小、顯示狀態(tài)、控件樹等,還對鼠標(biāo)、鍵盤消息的處理、分發(fā),使得拓展控件能處理CM_MOUSE、CM_KEY消息等。2、Container的實現(xiàn)Container在DirectUI里面的作用是管理控件、定位控件,Container也是繼承自BasicControl,能夠控制子控件、子容器的位置,也能夠傳遞控件刷新消息。Container內(nèi)部有一個向量容器,里面存儲的是BasicControl類型,對控件的添加、刪除等就是通過對向量容器的添加刪除完成的。當(dāng)上層Container傳來容器刷新消息時,就遍歷這個向量,然后向里面的每一個控件或者容器發(fā)送控件刷新消息,這樣就完成了整個容器的自繪。3、Button自繪控件的實現(xiàn)Button控件繼承自BasicControl控件,一個普通Button有4種狀態(tài),即normal,hover,push,disable。在相應(yīng)的控件刷新消息下,繪制對應(yīng)狀態(tài)的圖片、文字。4、Label自繪控件的實現(xiàn)Label控件的作用就是能顯示文字、圖片等,所以只需要處理控件刷新消息就可以了,在控件刷新消息下顯示文字與對應(yīng)的圖片。5、Edit自繪控件的實現(xiàn)Edit控件與其他控件的自繪不同,Windows平臺下的Edit控件是系統(tǒng)控件,如果自己實現(xiàn)一個要大量的精力,所以直接封裝了系統(tǒng)底層的Edit控件,然后通過向Edit控件發(fā)送系統(tǒng)消息,然后完成設(shè)置背景、邊框、顏色、字體等信息。6、WriteBoard自繪控件的實現(xiàn)WriteBoard的功能是能夠用鼠標(biāo)在控件內(nèi)書寫,而且除了能獲取整個控件內(nèi)的位圖,還能夠獲得每一次書寫的內(nèi)容。采用了三緩沖技術(shù),具體緩沖方法如下:(1)首先將鼠標(biāo)書寫內(nèi)容復(fù)制到StrokeBitmap中。(2)然后將StrokeBitmap里面的內(nèi)容復(fù)制到PaintBitmap中。(3)清理StrokeBitmap里面的內(nèi)容。(4)當(dāng)屏幕有刷新請求時,就將PaintBitmap復(fù)制到窗口DeviceContext,完成Writeboard的繪制。這樣做的好處是,既能保證屏幕不會閃爍,保護(hù)刷新工作的快速,還能獲得每一次書寫的位圖信息,也能獲得整個控件的位圖信息。7、WordPanel自繪控件的實現(xiàn)WordPanel的作用是顯示通過神經(jīng)網(wǎng)絡(luò)匹配出來的漢字,以及聯(lián)想出來的漢字。在控件內(nèi)部維護(hù)了存儲字的鏈表,由外界傳入鏈表,然后在刷新的時候,實時將鏈表里面的字寫到UI界面上去。同時也處理鼠標(biāo)消息,通過控件的方位以及鼠標(biāo)相對于控件的坐標(biāo)計算出當(dāng)前鼠標(biāo)所在的字,然后可以處理鼠標(biāo)移動消息、點擊消息等,并且傳遞出去。8、AssociatePanel自繪控件的實現(xiàn)AssociatePanel控件的作用是顯示查詢出來的聯(lián)想詞組,功能與WordPanel較為類似,不同之處在于WordPanel的網(wǎng)格是確定的,而AssociatePanel控件的網(wǎng)格需要顯示不同長度的漢字,所以與WordPanel的部分實現(xiàn)細(xì)節(jié)不同??丶岳L的效果見圖3.4。圖3.4自繪的UI界面本章小結(jié)本章主要講解了系統(tǒng)的幾個組成部分,然后講解了這些組成部分的實現(xiàn)原理、實現(xiàn)細(xì)節(jié)。首先介紹了神經(jīng)網(wǎng)絡(luò)算法的實現(xiàn)方法,然后介紹了數(shù)字識別的原理以及實現(xiàn)方法,在其中詳細(xì)介紹了圖像處理算法,接著介紹了漢字識別的原理以及實現(xiàn)方法,在其中詳細(xì)介紹了字庫以及聯(lián)想詞庫的管理方式,最后介紹了UI界面的實現(xiàn)方法。第4章系統(tǒng)測試及效果分析系統(tǒng)測試本系統(tǒng)設(shè)計了基于人工神經(jīng)元網(wǎng)絡(luò)的手寫識別系統(tǒng),現(xiàn)在需要對該系統(tǒng)進(jìn)行測試,針對系統(tǒng)的特點,對三個部分進(jìn)行測試,分別是對神經(jīng)網(wǎng)絡(luò)算法的測試、對數(shù)字圖像識別的測試、對手寫漢字識別的測試。神經(jīng)網(wǎng)絡(luò)算法的測試由于神經(jīng)元網(wǎng)絡(luò)算法是該本文中最重要的算法,所以針對該算法做了很多次測試,測試的結(jié)果滿足預(yù)先的要求。首先用一些簡單的函數(shù)去生成一些測試數(shù)據(jù),測試的函數(shù)有y=sin(x)、y=x^2、y=x,這些函數(shù)通過神經(jīng)元訓(xùn)練后的結(jié)果,都與原值有一定的誤差,但是誤差都比較小。隨著訓(xùn)練次數(shù)的逐漸增加,誤差也是逐漸減小,但是不能完全消除。然后采用google的機(jī)器視覺庫mnist進(jìn)行測試,也獲得了良好的結(jié)果,在只訓(xùn)練一次的情況下,正確率能達(dá)到91.7%,在訓(xùn)練20次的情況下,正確率能達(dá)到95%左右,在訓(xùn)練100次的情況下,能達(dá)到97%左右,在訓(xùn)練500次的情況下,正確能達(dá)到98%。然后調(diào)整通過大量調(diào)整學(xué)習(xí)率以及慣性項系數(shù),找到了幾個比較合適的數(shù)字,最終神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)率確定為0.25,慣性項系數(shù)確定為0.1。從上面的測試數(shù)據(jù)可以得出,算法的實現(xiàn)結(jié)果良好,同時也可以得出,在一定范圍內(nèi),增加訓(xùn)練次數(shù),能有效增加正確率,當(dāng)正確率到達(dá)一定程度后,再增加訓(xùn)練次數(shù)雖然能增加正確率,但是效果已經(jīng)不是很明顯了。手寫數(shù)字識別的測試對手寫數(shù)字識別的測試主要分為以下幾個方面:(1)對圖像處理算法的測試。包括對各種圖像算法的正確性、有效性的一些測試。(2)對訓(xùn)練集合的測試。該測試部分包括對所有收集的數(shù)字圖像的特征矩陣,選擇部分輸入到神經(jīng)網(wǎng)絡(luò)中,剩下的部分作為測試數(shù)據(jù),測試其正確率。(3)對手寫數(shù)字識別的測試。該部分包括對各種手寫數(shù)字輸入到系統(tǒng)中,進(jìn)行測試。在對圖像處理算法的測試中,采用了從網(wǎng)絡(luò)搜索的一些圖片作為測試源。這些圖片有的24位位圖,有的是256色位圖,測試過程當(dāng)中發(fā)現(xiàn)對256色位圖支持不好。由于程序編寫過程當(dāng)中,加載圖片部分加載的位圖結(jié)構(gòu)為24位位圖結(jié)構(gòu),所以在加載前首先判斷位圖格式,然后加載24位位圖。然后在測試梯度銳化的時候,會發(fā)現(xiàn)有時候程序會崩潰,檢查原因,發(fā)現(xiàn)是最后一行與最后一列沒處理好,導(dǎo)致內(nèi)存訪問異常而使得程序崩潰。在測試去掉離散點的過程當(dāng)中,發(fā)現(xiàn)有時候會導(dǎo)致程序崩潰,經(jīng)過調(diào)試發(fā)現(xiàn),有的位圖離散點大,閾值較大,然后會導(dǎo)致棧遞歸深度太大而爆棧,后面將深度搜索算法改為廣度搜索算法使得程序運行正常。其他算法測試結(jié)果均正常,而且速度都很快,即使用極端的數(shù)據(jù)測試,也沒有問題。在對訓(xùn)練集合的測試中,收集了近300組測試數(shù)據(jù),采取了幾種不同的測試方法,首先將所有的測試數(shù)據(jù)平均分成5組,前4組作為訓(xùn)練數(shù)據(jù),然后將剩下的一組作為測試數(shù)據(jù),輸入到神經(jīng)網(wǎng)絡(luò)當(dāng)中,在訓(xùn)練次數(shù)為20次的前提下,能夠獲得97%的正確率,在訓(xùn)練次數(shù)為500次的前提下,能夠獲得100%的正確率。然后將所有的數(shù)據(jù)平均分成3組,前兩組作為訓(xùn)練數(shù)據(jù),剩下的一組作為測試數(shù)據(jù),在訓(xùn)練次數(shù)為20次的前提下,獲得了87%的正確率,在訓(xùn)練次數(shù)為500次的前提下,獲得了93%的正確率。然后接著將測試數(shù)據(jù)打亂,再進(jìn)行上述測試,依舊獲得了較高的正確率,由此可以判斷收集的數(shù)據(jù)正確率可以得到保證。在對手寫數(shù)字識別的測試中,首先從網(wǎng)上收集了一些數(shù)字圖像,然后輸入到系統(tǒng)當(dāng)中,首先進(jìn)行圖像的處理,然后經(jīng)過神經(jīng)網(wǎng)絡(luò)識別,發(fā)現(xiàn)了一些問題。圖象的處理需要手動去處理,因為圖像之間的差別較大,需要用不同的算法來處理,有時候需要用同樣的算法處理一次,這樣就不能用一套固定的流程來完成所有的圖像處理??紤]到上述問題,在程序當(dāng)中加入了手動處理圖像,首先自動或者手動來處理程序,獲得一個較好的特征矩陣然后再去識別。在用多組圖片進(jìn)行識別的過程中,有一部分圖片能夠很好的獲得特征矩陣,但是沒法通過神經(jīng)網(wǎng)絡(luò)進(jìn)行識別,考慮到數(shù)據(jù)量的原因,300組數(shù)據(jù)太少了,所以一部分?jǐn)?shù)字圖像沒辦法識別。部分測試數(shù)據(jù)見表4.1。表4.1部分?jǐn)?shù)字圖像測試數(shù)據(jù)測試圖像測試結(jié)果手寫漢字識別的測試對手寫漢字識別的測試主要分為以下幾個方面:(1)對圖像處理算法的測試,包括對圖像處理的正確率,以及效率的測試。(2)對訓(xùn)練集合的測試,該部分包括用神經(jīng)網(wǎng)絡(luò)對采集的筆畫的正確性測試,以及特殊筆畫的測試。(3)對字庫的測試,包括通過筆畫查詢漢字、查詢相似漢字的正確性測試以及查詢速度測試。(4)對聯(lián)想詞組的測試,包括通過漢字查詢聯(lián)想詞組以及熱度排名的正確性和效率測試。在對圖像處理算法的測試過程當(dāng)中,由于處理算法與對數(shù)字圖像處理算法類似,而且更加簡單一些,所以算法復(fù)用,該測試過程中沒出現(xiàn)問題。在對訓(xùn)練集合的測試過程當(dāng)中,采取了與對數(shù)字測試數(shù)據(jù)類似的測試方法,測試的筆畫集合在500左右,多次測試也獲得了不錯的正確率。針對特殊的情況,比如點筆畫,直接通過大小進(jìn)行測試,然后一些與測試的筆畫類似的筆畫,也通過該神經(jīng)網(wǎng)絡(luò)來測試,測試的方法與上面一樣,最終得到的結(jié)果也與預(yù)期的結(jié)果類似。在對字庫的測試過程中,首先測試了外存存儲文件的有效性,擾亂外存文件,當(dāng)加載字庫的時候能正確返回文件無效,通過檢查內(nèi)存,發(fā)現(xiàn)字庫里面存在的字庫都已經(jīng)成功導(dǎo)入到內(nèi)存中,并且結(jié)構(gòu)都正確。然后測試了trie樹的正確性,通過多次查詢、遍歷,都與預(yù)計的效果一樣,也沒有發(fā)現(xiàn)內(nèi)存泄漏等情況,。然后將字庫導(dǎo)入到trie樹中,通過筆劃查詢漢字以及相似漢字,都獲得了與預(yù)計一樣的效果。在對聯(lián)想詞組的測試過程當(dāng)中,首先測試了聯(lián)想詞組庫的有效性,發(fā)現(xiàn)收集的聯(lián)想詞庫里面存在英文、數(shù)字,一旦導(dǎo)入內(nèi)存,可能會導(dǎo)致查詢的結(jié)果出錯,于是編寫腳本程序過濾掉了英文、數(shù)字。然后測試了TopK算法,通過隨機(jī)大量的測試數(shù)據(jù),通過實時檢測priorityqueue的內(nèi)容,正確的得到了K個最大的數(shù)據(jù)。接著將聯(lián)想詞庫導(dǎo)入到內(nèi)存中,測試了詞庫在內(nèi)存中的正確性,發(fā)現(xiàn)沒有內(nèi)存泄漏以及指針非法訪問等情況,接著測試了聯(lián)想詞庫的查詢,除了第一次導(dǎo)入內(nèi)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職氧化還原滴定法(氧化還原反應(yīng)實操)試題及答案
- 2025年高職第二學(xué)年(機(jī)械設(shè)計制造及其自動化)數(shù)控技術(shù)應(yīng)用試題及答案
- 2025年大學(xué)植物學(xué)(特性分析)試題及答案
- 2025年高職(旅游管理綜合實訓(xùn))市場拓展實操試題及答案
- 2025年高職(廣告策劃與營銷)廣告策劃階段測試題及答案
- 2025年高職社會工作(社會救助)試題及答案
- 2025 小學(xué)四年級思想品德下冊家風(fēng)傳承優(yōu)化主題實踐改進(jìn)課件
- 中學(xué)師德教風(fēng)專題培訓(xùn)
- 養(yǎng)老院老人康復(fù)設(shè)施維修人員表彰制度
- 養(yǎng)老院工作人員請假及調(diào)休制度
- 2025-2026學(xué)年人教版九年級上冊歷史期末試卷(含答案和解析)
- 重癥醫(yī)學(xué)科ICU知情同意書電子病歷
- 小區(qū)配電室用電安全培訓(xùn)課件
- 醫(yī)院科室文化建設(shè)與禮儀
- 2025貴州磷化(集團(tuán))有限責(zé)任公司12月招聘筆試參考題庫及答案解析
- 征信修復(fù)合同范本
- 2025年公安部遴選面試題及答案
- 中煤集團(tuán)機(jī)電裝備部副部長管理能力考試題集含答案
- 福建省網(wǎng)絡(luò)安全事件應(yīng)急預(yù)案
- 五育融合課件
- 意識障礙的判斷及護(hù)理
評論
0/150
提交評論