余 菲,趙 杰,王靜霞,溫國忠,宋 榮
(深圳職業技術學院 電子與通信工程學院,廣東 深圳518055)
隨著電子信息技術的發展,尤其是高性能處理器、互聯網、云計算等技術的高速發展,基于神經網絡的人工智能系統的應用價值越來越大[1-3].目前,人工智能的核心應用領域主要集中在圖像識別、語音識別、汽車及其它設備的自主判斷和自主控制等.其中,圖像識別仍然是人工智能應用的最重要領域,而BP 神經網絡也是對字符進行人工智能識別的最有效手段之一[3-6].基于BP 神經網絡的字符人工智能識別和其他的人工智能應用一樣,受制于處理器的運算速度.因此如何能夠有效地提高BP 神經網絡的運算速度就變成了非常有價值的研究領域.本文提出采用Matlab 進行系統建模仿真,并利用FPGA 技術實現BP 神經網絡神經元的辦法,通過硬件電路進行計算來有效提升系統的效率,讓低電路代價的字符識在工程上變得可能.
人工智能系統與傳統的電子系統設計方法最大的不同是人工智能系統設計過程需要一個“學習”的過程,這種學習可以是“有導”式的,或者是自主的“無導”式[1].首先建立一個神經網絡的結構,通常是BP 神經網絡或者CNN(卷積神經網絡)等,然后通過訓練(學習),讓神經網絡逐步開始能夠對學習過的樣本具有判斷和記憶,再對神經網絡的判定效果進行評價,如果達不到設計要求則需要重新從建立神經網絡結構開始重復,基本流程如圖1所示.

圖1 神經網絡的設計流程
通常,圖像識別的神經網絡學習過程是“有導”式的.“有導”式的學習需要首先準備“金樣本”數據集,所謂“金樣本”就是經過人工標記的準確無誤的系統輸入輸出案例.準備好了樣本數據集后,將該數據集分為訓練集和測試集2 類,通常分類的原則是隨機選?。酉聛砝肕atlab 人工智能工具箱、Tensor Flow 等平臺系統,對該人工智能的神經網絡結構進行建模編程,利用訓練集樣本對神經網絡進行訓練,使得神經網絡學習到模型參數,最后再通過測試樣本的測試,達到精度要求后證明該神經網絡的模型是有效的[3,5-6].目前很多研究僅僅停留在設計完成神經網絡結構并完成網絡參數的訓練,但是訓練好的神經網絡還需要在硬件上實現,是否能夠在工程允許的硬件代價下物理上實現該神經網絡模型也是一個很實際的問題.
首先收集用于識別的字符數據集,其中包含0~9 這10 個數字手寫體的圖片文件,此類數據集在網絡上可以進行下載,也可以自己準備,然后對該圖片進行標記,使之成為“金樣本”.在本文中,每個數字準備了500 張不同的手寫文件,總計5000 張圖片作為數據集.接下來對圖片進行歸一化處理,統一歸一化為28*28 的像素,樣例如圖2所示.
通過Matlab 讀入全部圖片的信息,使用Matlab 編程把所有圖片的樣本標記結果存儲在一個數據矩陣內,部分矩陣內容如圖3所示.
由于圖片是灰度數據,與CNN 不同,需要轉換為二進制矢量數據才能進行BP 神經網絡的數據輸入,本文按照如圖4所示方法進行二進制矢量轉換.
首先設定將得到的輸入圖像通過最大類間方差法得到一個合適的灰度閾值,通過此閾值將圖片轉換為70*50 的2 進制流圖.特征提取規則為:取一個大小為10*10 像素的框,選取70*50的圖像,總共可有7*5 種不同的排列組合,將選取的10*10 圖像中的黑色像素所占百分比作為特征數,便可得一個7*5 的特征矩陣.
將上述特征提取后的數據分為2 部分,第一部分作為我們的輸入數據,第二部分作為測試數據.用輸入數據訓練網絡,網絡訓練完成后,用測試數據驗證網絡準確率.利用Matlab 的人工智能神經網絡工具箱設置本文所述的字符識別系統,其BP 神經網絡結構如圖5所示.

圖2 歸一化的圖片文件樣例

圖3 樣本標記結果記錄矩陣的部分內容

圖4 二進制矢量轉化方法示意圖

圖5 字符識別系統的BP 神經網絡結構
第一層Hidden Layer 為此數字識別網絡的隱含層,第二層Output Layer 為此數字識別網絡的輸出層,輸出層神經元個數由輸出目標數據所決定,此處為10.隱含層的神經元數目設置為25,當神經元數目設置過少時識別效果會很差,當神經元數目設置過多時又太過占用硬件資源,經測試本文設定為25 個比較合適,并且隱含層和輸出層的傳輸函數都選擇“tansig”.訓練函數選擇為“trainlm”(用于更新權值和偏置),適應性學習函數為“learngdm”(使得權值和偏置區有一定的動量),誤差函數為“mse”.其他訓練參數設定如圖6所示.

圖6 BP 神經網絡訓練參數設定
經過訓練,本文所述的模型訓練過程的Validation checks 最終是6,即訓練結束就是因為連續6 次迭代都沒能提高準確率.總共迭代次數為308,最終結束時以SSE(殘差平方和)方式計算誤差,其誤差結果為718,迭代的表現如圖7所示.
圖7中分別展示了隨迭代次數的平方誤差的變化情況,其中橫坐標為Epoch(時期),一個Epoch 表示所有訓練樣本的一個正向傳遞和一個反向傳遞的過程,縱坐標為SSE(殘差平方和).雖然Train 曲線隨著Epoch 下降,但Test 曲線在第16 個Epoch 時SSE 卻開始上升.因此,最終神經網絡的參數在16 個Epoch(在圖7中已經用圓圈標記)得到最好的效果.
以Scaled Conjugate Gradient(量化共軛梯度法)為訓練函數結束時的梯度值為161,然后用之前已準備好的測試集來對已訓練好的神經網絡進行仿真,其準確率如圖8所示,圖中橫坐標為目標值,縱坐標為網絡的輸出,圖8就是做了個回歸,完美時四幅曲線都應該在對角線上,最終的綜合精度為85.20%.
神經網絡容易過擬合,即僅對參與訓練的訓練數據反應良好.為防止過擬合,除一開始就劃分了訓練集合測試集外,MATLAB 不會把給它的訓練集數據都同時用于訓練、驗證、測試,會將其再次劃分成3 個集,training(訓練集),validation(驗證集),test(測試集).訓練時只有training(訓練集)參加訓練,validation(驗證集),test(測試集)不參加訓練,只用于最終檢驗.為了防止過擬合發生,需要設定適當的validation 值,當validation 的誤差連續上升到設置的次數時就停止訓練.

圖7 方差隨著迭代變化曲線

圖8 測試集合的準確率曲線
根據前文所述,Matlab 可以有效地完成神經網絡的建模及訓練與評測,但仍需要最終實現在硬件電路上.雖然,可以利用編寫軟件的方法在高性能DSP、GPU 或者TPU(由谷歌公司設計的專用人工智能處理器)上實現本文設計的神經網絡,但是成本和硬件代價都過高,本文提出了有針對性的方案,可利用FPGA 實現神經網絡的神經元[4,7],大幅降低了系統的硬件代價.
根據BP 神經網絡的基本結構,需要用FPGA實現的神經元結構如圖9所示.
從上面訓練好的神經網絡中抽取出神經網絡相關參數后,可知數據為有符號浮點型數據,且有效位數到小數點后5 位.在FPGA 中需要合理地表示數據,由于FPGA 中默認情況下不支持對浮點數進行操作的,這里采用的解決辦法是定標.也就是將要運算的浮點數擴大倍數,然后截取整數部分,用這個數代替原本的浮點數,完成運算后,得到的結果再縮小相應的倍數.
在這里我們就要用到定標的方法,由于系統的輸入范圍是0~1 的浮點數,例如0.34302,將小數轉變為整數,并且事先進行約定統一將小數放大10000 倍,剩余小數部分四舍五入,也即將0.34302 用3430 表示.利用Modelsim-Altera 仿真平臺上搭建系統,對輸入輸出及權值變換進行仿真驗證,圖10 為其中一次的仿真實例.
根據MATLAB 上訓練出的神經網絡知,FPGA 上實現的激勵函數有2 個:
1)隱含層的激勵函數為tansig 函數;
2)輸出層的激勵函數為pureline 函數.

圖9 BP 神經網絡神經元結構

圖10 浮點數變換整數實例
其中隱含層為了實現功能選擇了非線性的激勵函數,輸出層則選擇了簡單的線性激勵函數作為輸出.要在FPGA 上實現函數求解有多種方式可以進行選擇,這里選擇查表法.此方法最為簡單,通用性強,但缺點是隨著精度的增加對內存的消耗呈指數性增長.若要保證查表法的精確,計算就要用掉大部分的存儲單元,顯然不滿足實際資源的需求,所以常常降低輸入的精度,但隨之帶來的會是誤差的增大,需要在資源的消耗和誤差的大小間做出取舍.最終,本文利用Verilog 硬件描述語言實現了神經網絡的神經元結構,并搭建了整個字符識別系統,仿真效果如圖11 所示.由圖11 可見,利用FPGA實現的硬件電路效果與Matlab 的仿真數據一致.本文為了驗證電路的正確性,利用Altera 公司的FPGA芯片實際綜合下載了神經元及相關系統,能夠實現對字符圖像文件數據的計算.

圖11 數字“6”的圖片識別效果仿真
本文利用Matlab 建立了一種可以用于圖像數字圖像識別的神經網絡,并為1 到9 每個數字準備了500 張不同的手寫文件,總計5000 張圖片作為數據集,對圖片進行歸一化處理,統一歸一化為28*28 的像素,并完成了神經網絡的學習和訓練.同時,利用本文提出的神將網絡模型,利用FPGA 數字電路設計技術,從硬件上實現了該神經網絡的神經元電路.經過Matlab 工具的仿真驗證,本文提出的BP 神經網絡結構和訓練方法可以有效地實現字符圖像文件的識別,有效率達到85.20%.通過FPGA 實現的該系統神經元硬件電路,通過Modelsim 仿真,結果與Matlab 一致.通過實際綜合下載,電路運算功能正確.