余 菲,趙 杰,王靜霞,溫國(guó)忠,宋 榮
(深圳職業(yè)技術(shù)學(xué)院 電子與通信工程學(xué)院,廣東 深圳518055)
隨著電子信息技術(shù)的發(fā)展,尤其是高性能處理器、互聯(lián)網(wǎng)、云計(jì)算等技術(shù)的高速發(fā)展,基于神經(jīng)網(wǎng)絡(luò)的人工智能系統(tǒng)的應(yīng)用價(jià)值越來(lái)越大[1-3].目前,人工智能的核心應(yīng)用領(lǐng)域主要集中在圖像識(shí)別、語(yǔ)音識(shí)別、汽車及其它設(shè)備的自主判斷和自主控制等.其中,圖像識(shí)別仍然是人工智能應(yīng)用的最重要領(lǐng)域,而B(niǎo)P 神經(jīng)網(wǎng)絡(luò)也是對(duì)字符進(jìn)行人工智能識(shí)別的最有效手段之一[3-6].基于BP 神經(jīng)網(wǎng)絡(luò)的字符人工智能識(shí)別和其他的人工智能應(yīng)用一樣,受制于處理器的運(yùn)算速度.因此如何能夠有效地提高BP 神經(jīng)網(wǎng)絡(luò)的運(yùn)算速度就變成了非常有價(jià)值的研究領(lǐng)域.本文提出采用Matlab 進(jìn)行系統(tǒng)建模仿真,并利用FPGA 技術(shù)實(shí)現(xiàn)BP 神經(jīng)網(wǎng)絡(luò)神經(jīng)元的辦法,通過(guò)硬件電路進(jìn)行計(jì)算來(lái)有效提升系統(tǒng)的效率,讓低電路代價(jià)的字符識(shí)在工程上變得可能.
人工智能系統(tǒng)與傳統(tǒng)的電子系統(tǒng)設(shè)計(jì)方法最大的不同是人工智能系統(tǒng)設(shè)計(jì)過(guò)程需要一個(gè)“學(xué)習(xí)”的過(guò)程,這種學(xué)習(xí)可以是“有導(dǎo)”式的,或者是自主的“無(wú)導(dǎo)”式[1].首先建立一個(gè)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),通常是BP 神經(jīng)網(wǎng)絡(luò)或者CNN(卷積神經(jīng)網(wǎng)絡(luò))等,然后通過(guò)訓(xùn)練(學(xué)習(xí)),讓神經(jīng)網(wǎng)絡(luò)逐步開(kāi)始能夠?qū)W(xué)習(xí)過(guò)的樣本具有判斷和記憶,再對(duì)神經(jīng)網(wǎng)絡(luò)的判定效果進(jìn)行評(píng)價(jià),如果達(dá)不到設(shè)計(jì)要求則需要重新從建立神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)開(kāi)始重復(fù),基本流程如圖1所示.
圖1 神經(jīng)網(wǎng)絡(luò)的設(shè)計(jì)流程
通常,圖像識(shí)別的神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)過(guò)程是“有導(dǎo)”式的.“有導(dǎo)”式的學(xué)習(xí)需要首先準(zhǔn)備“金樣本”數(shù)據(jù)集,所謂“金樣本”就是經(jīng)過(guò)人工標(biāo)記的準(zhǔn)確無(wú)誤的系統(tǒng)輸入輸出案例.準(zhǔn)備好了樣本數(shù)據(jù)集后,將該數(shù)據(jù)集分為訓(xùn)練集和測(cè)試集2 類,通常分類的原則是隨機(jī)選?。酉聛?lái)利用Matlab 人工智能工具箱、Tensor Flow 等平臺(tái)系統(tǒng),對(duì)該人工智能的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行建模編程,利用訓(xùn)練集樣本對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,使得神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)到模型參數(shù),最后再通過(guò)測(cè)試樣本的測(cè)試,達(dá)到精度要求后證明該神經(jīng)網(wǎng)絡(luò)的模型是有效的[3,5-6].目前很多研究?jī)H僅停留在設(shè)計(jì)完成神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)并完成網(wǎng)絡(luò)參數(shù)的訓(xùn)練,但是訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)還需要在硬件上實(shí)現(xiàn),是否能夠在工程允許的硬件代價(jià)下物理上實(shí)現(xiàn)該神經(jīng)網(wǎng)絡(luò)模型也是一個(gè)很實(shí)際的問(wèn)題.
首先收集用于識(shí)別的字符數(shù)據(jù)集,其中包含0~9 這10 個(gè)數(shù)字手寫體的圖片文件,此類數(shù)據(jù)集在網(wǎng)絡(luò)上可以進(jìn)行下載,也可以自己準(zhǔn)備,然后對(duì)該圖片進(jìn)行標(biāo)記,使之成為“金樣本”.在本文中,每個(gè)數(shù)字準(zhǔn)備了500 張不同的手寫文件,總計(jì)5000 張圖片作為數(shù)據(jù)集.接下來(lái)對(duì)圖片進(jìn)行歸一化處理,統(tǒng)一歸一化為28*28 的像素,樣例如圖2所示.
通過(guò)Matlab 讀入全部圖片的信息,使用Matlab 編程把所有圖片的樣本標(biāo)記結(jié)果存儲(chǔ)在一個(gè)數(shù)據(jù)矩陣內(nèi),部分矩陣內(nèi)容如圖3所示.
由于圖片是灰度數(shù)據(jù),與CNN 不同,需要轉(zhuǎn)換為二進(jìn)制矢量數(shù)據(jù)才能進(jìn)行BP 神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù)輸入,本文按照如圖4所示方法進(jìn)行二進(jìn)制矢量轉(zhuǎn)換.
首先設(shè)定將得到的輸入圖像通過(guò)最大類間方差法得到一個(gè)合適的灰度閾值,通過(guò)此閾值將圖片轉(zhuǎn)換為70*50 的2 進(jìn)制流圖.特征提取規(guī)則為:取一個(gè)大小為10*10 像素的框,選取70*50的圖像,總共可有7*5 種不同的排列組合,將選取的10*10 圖像中的黑色像素所占百分比作為特征數(shù),便可得一個(gè)7*5 的特征矩陣.
將上述特征提取后的數(shù)據(jù)分為2 部分,第一部分作為我們的輸入數(shù)據(jù),第二部分作為測(cè)試數(shù)據(jù).用輸入數(shù)據(jù)訓(xùn)練網(wǎng)絡(luò),網(wǎng)絡(luò)訓(xùn)練完成后,用測(cè)試數(shù)據(jù)驗(yàn)證網(wǎng)絡(luò)準(zhǔn)確率.利用Matlab 的人工智能神經(jīng)網(wǎng)絡(luò)工具箱設(shè)置本文所述的字符識(shí)別系統(tǒng),其BP 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)如圖5所示.
圖2 歸一化的圖片文件樣例
圖3 樣本標(biāo)記結(jié)果記錄矩陣的部分內(nèi)容
圖4 二進(jìn)制矢量轉(zhuǎn)化方法示意圖
圖5 字符識(shí)別系統(tǒng)的BP 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
第一層Hidden Layer 為此數(shù)字識(shí)別網(wǎng)絡(luò)的隱含層,第二層Output Layer 為此數(shù)字識(shí)別網(wǎng)絡(luò)的輸出層,輸出層神經(jīng)元個(gè)數(shù)由輸出目標(biāo)數(shù)據(jù)所決定,此處為10.隱含層的神經(jīng)元數(shù)目設(shè)置為25,當(dāng)神經(jīng)元數(shù)目設(shè)置過(guò)少時(shí)識(shí)別效果會(huì)很差,當(dāng)神經(jīng)元數(shù)目設(shè)置過(guò)多時(shí)又太過(guò)占用硬件資源,經(jīng)測(cè)試本文設(shè)定為25 個(gè)比較合適,并且隱含層和輸出層的傳輸函數(shù)都選擇“tansig”.訓(xùn)練函數(shù)選擇為“trainlm”(用于更新權(quán)值和偏置),適應(yīng)性學(xué)習(xí)函數(shù)為“l(fā)earngdm”(使得權(quán)值和偏置區(qū)有一定的動(dòng)量),誤差函數(shù)為“mse”.其他訓(xùn)練參數(shù)設(shè)定如圖6所示.
圖6 BP 神經(jīng)網(wǎng)絡(luò)訓(xùn)練參數(shù)設(shè)定
經(jīng)過(guò)訓(xùn)練,本文所述的模型訓(xùn)練過(guò)程的Validation checks 最終是6,即訓(xùn)練結(jié)束就是因?yàn)檫B續(xù)6 次迭代都沒(méi)能提高準(zhǔn)確率.總共迭代次數(shù)為308,最終結(jié)束時(shí)以SSE(殘差平方和)方式計(jì)算誤差,其誤差結(jié)果為718,迭代的表現(xiàn)如圖7所示.
圖7中分別展示了隨迭代次數(shù)的平方誤差的變化情況,其中橫坐標(biāo)為Epoch(時(shí)期),一個(gè)Epoch 表示所有訓(xùn)練樣本的一個(gè)正向傳遞和一個(gè)反向傳遞的過(guò)程,縱坐標(biāo)為SSE(殘差平方和).雖然Train 曲線隨著Epoch 下降,但Test 曲線在第16 個(gè)Epoch 時(shí)SSE 卻開(kāi)始上升.因此,最終神經(jīng)網(wǎng)絡(luò)的參數(shù)在16 個(gè)Epoch(在圖7中已經(jīng)用圓圈標(biāo)記)得到最好的效果.
以Scaled Conjugate Gradient(量化共軛梯度法)為訓(xùn)練函數(shù)結(jié)束時(shí)的梯度值為161,然后用之前已準(zhǔn)備好的測(cè)試集來(lái)對(duì)已訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)進(jìn)行仿真,其準(zhǔn)確率如圖8所示,圖中橫坐標(biāo)為目標(biāo)值,縱坐標(biāo)為網(wǎng)絡(luò)的輸出,圖8就是做了個(gè)回歸,完美時(shí)四幅曲線都應(yīng)該在對(duì)角線上,最終的綜合精度為85.20%.
神經(jīng)網(wǎng)絡(luò)容易過(guò)擬合,即僅對(duì)參與訓(xùn)練的訓(xùn)練數(shù)據(jù)反應(yīng)良好.為防止過(guò)擬合,除一開(kāi)始就劃分了訓(xùn)練集合測(cè)試集外,MATLAB 不會(huì)把給它的訓(xùn)練集數(shù)據(jù)都同時(shí)用于訓(xùn)練、驗(yàn)證、測(cè)試,會(huì)將其再次劃分成3 個(gè)集,training(訓(xùn)練集),validation(驗(yàn)證集),test(測(cè)試集).訓(xùn)練時(shí)只有training(訓(xùn)練集)參加訓(xùn)練,validation(驗(yàn)證集),test(測(cè)試集)不參加訓(xùn)練,只用于最終檢驗(yàn).為了防止過(guò)擬合發(fā)生,需要設(shè)定適當(dāng)?shù)膙alidation 值,當(dāng)validation 的誤差連續(xù)上升到設(shè)置的次數(shù)時(shí)就停止訓(xùn)練.
圖7 方差隨著迭代變化曲線
圖8 測(cè)試集合的準(zhǔn)確率曲線
根據(jù)前文所述,Matlab 可以有效地完成神經(jīng)網(wǎng)絡(luò)的建模及訓(xùn)練與評(píng)測(cè),但仍需要最終實(shí)現(xiàn)在硬件電路上.雖然,可以利用編寫軟件的方法在高性能DSP、GPU 或者TPU(由谷歌公司設(shè)計(jì)的專用人工智能處理器)上實(shí)現(xiàn)本文設(shè)計(jì)的神經(jīng)網(wǎng)絡(luò),但是成本和硬件代價(jià)都過(guò)高,本文提出了有針對(duì)性的方案,可利用FPGA 實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的神經(jīng)元[4,7],大幅降低了系統(tǒng)的硬件代價(jià).
根據(jù)BP 神經(jīng)網(wǎng)絡(luò)的基本結(jié)構(gòu),需要用FPGA實(shí)現(xiàn)的神經(jīng)元結(jié)構(gòu)如圖9所示.
從上面訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)中抽取出神經(jīng)網(wǎng)絡(luò)相關(guān)參數(shù)后,可知數(shù)據(jù)為有符號(hào)浮點(diǎn)型數(shù)據(jù),且有效位數(shù)到小數(shù)點(diǎn)后5 位.在FPGA 中需要合理地表示數(shù)據(jù),由于FPGA 中默認(rèn)情況下不支持對(duì)浮點(diǎn)數(shù)進(jìn)行操作的,這里采用的解決辦法是定標(biāo).也就是將要運(yùn)算的浮點(diǎn)數(shù)擴(kuò)大倍數(shù),然后截取整數(shù)部分,用這個(gè)數(shù)代替原本的浮點(diǎn)數(shù),完成運(yùn)算后,得到的結(jié)果再縮小相應(yīng)的倍數(shù).
在這里我們就要用到定標(biāo)的方法,由于系統(tǒng)的輸入范圍是0~1 的浮點(diǎn)數(shù),例如0.34302,將小數(shù)轉(zhuǎn)變?yōu)檎麛?shù),并且事先進(jìn)行約定統(tǒng)一將小數(shù)放大10000 倍,剩余小數(shù)部分四舍五入,也即將0.34302 用3430 表示.利用Modelsim-Altera 仿真平臺(tái)上搭建系統(tǒng),對(duì)輸入輸出及權(quán)值變換進(jìn)行仿真驗(yàn)證,圖10 為其中一次的仿真實(shí)例.
根據(jù)MATLAB 上訓(xùn)練出的神經(jīng)網(wǎng)絡(luò)知,F(xiàn)PGA 上實(shí)現(xiàn)的激勵(lì)函數(shù)有2 個(gè):
1)隱含層的激勵(lì)函數(shù)為tansig 函數(shù);
2)輸出層的激勵(lì)函數(shù)為pureline 函數(shù).
圖9 BP 神經(jīng)網(wǎng)絡(luò)神經(jīng)元結(jié)構(gòu)
圖10 浮點(diǎn)數(shù)變換整數(shù)實(shí)例
其中隱含層為了實(shí)現(xiàn)功能選擇了非線性的激勵(lì)函數(shù),輸出層則選擇了簡(jiǎn)單的線性激勵(lì)函數(shù)作為輸出.要在FPGA 上實(shí)現(xiàn)函數(shù)求解有多種方式可以進(jìn)行選擇,這里選擇查表法.此方法最為簡(jiǎn)單,通用性強(qiáng),但缺點(diǎn)是隨著精度的增加對(duì)內(nèi)存的消耗呈指數(shù)性增長(zhǎng).若要保證查表法的精確,計(jì)算就要用掉大部分的存儲(chǔ)單元,顯然不滿足實(shí)際資源的需求,所以常常降低輸入的精度,但隨之帶來(lái)的會(huì)是誤差的增大,需要在資源的消耗和誤差的大小間做出取舍.最終,本文利用Verilog 硬件描述語(yǔ)言實(shí)現(xiàn)了神經(jīng)網(wǎng)絡(luò)的神經(jīng)元結(jié)構(gòu),并搭建了整個(gè)字符識(shí)別系統(tǒng),仿真效果如圖11 所示.由圖11 可見(jiàn),利用FPGA實(shí)現(xiàn)的硬件電路效果與Matlab 的仿真數(shù)據(jù)一致.本文為了驗(yàn)證電路的正確性,利用Altera 公司的FPGA芯片實(shí)際綜合下載了神經(jīng)元及相關(guān)系統(tǒng),能夠?qū)崿F(xiàn)對(duì)字符圖像文件數(shù)據(jù)的計(jì)算.
圖11 數(shù)字“6”的圖片識(shí)別效果仿真
本文利用Matlab 建立了一種可以用于圖像數(shù)字圖像識(shí)別的神經(jīng)網(wǎng)絡(luò),并為1 到9 每個(gè)數(shù)字準(zhǔn)備了500 張不同的手寫文件,總計(jì)5000 張圖片作為數(shù)據(jù)集,對(duì)圖片進(jìn)行歸一化處理,統(tǒng)一歸一化為28*28 的像素,并完成了神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)和訓(xùn)練.同時(shí),利用本文提出的神將網(wǎng)絡(luò)模型,利用FPGA 數(shù)字電路設(shè)計(jì)技術(shù),從硬件上實(shí)現(xiàn)了該神經(jīng)網(wǎng)絡(luò)的神經(jīng)元電路.經(jīng)過(guò)Matlab 工具的仿真驗(yàn)證,本文提出的BP 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)和訓(xùn)練方法可以有效地實(shí)現(xiàn)字符圖像文件的識(shí)別,有效率達(dá)到85.20%.通過(guò)FPGA 實(shí)現(xiàn)的該系統(tǒng)神經(jīng)元硬件電路,通過(guò)Modelsim 仿真,結(jié)果與Matlab 一致.通過(guò)實(shí)際綜合下載,電路運(yùn)算功能正確.