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