孫敬成,王正彥,李增剛
青島大學(xué) 電子信息學(xué)院,山東 青島 266071
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks,CNN)是一類包含卷積計(jì)算且具有深度結(jié)構(gòu)的前饋神經(jīng)網(wǎng)絡(luò),是深度學(xué)習(xí)的代表算法之一[1]。近年來,卷積神經(jīng)網(wǎng)絡(luò)在多方向持續(xù)發(fā)力,已成為圖像識(shí)別和語音分析領(lǐng)域中的研究熱點(diǎn)[2]。相較BP神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),引入卷積層與混合層,降低了運(yùn)算量。
手寫數(shù)字識(shí)別是模式識(shí)別領(lǐng)域中熱點(diǎn)問題,有著重要的理論價(jià)值[3]。識(shí)別過程首先通過網(wǎng)絡(luò)反向傳播訓(xùn)練樣本數(shù)據(jù),提取識(shí)別率較高的權(quán)重與偏置用于前向傳播,通過計(jì)算帶權(quán)輸入與激活值,以輸出層中激活值最大值所對(duì)應(yīng)的位置表示識(shí)別值。訓(xùn)練樣本數(shù)據(jù)來源于MNIST 數(shù)據(jù)庫,數(shù)據(jù)庫中為人工手寫的0~9 的數(shù)字圖片,包括50 000 訓(xùn)練樣本和10 000 驗(yàn)證樣本,灰度值于0~255之間,像素大小均為28×28[4]。盡管數(shù)字識(shí)別類別較小,但卻有利于深入分析以及驗(yàn)證新結(jié)論,能夠推廣其他相關(guān)問題,一個(gè)直接應(yīng)用即英文字母的識(shí)別。
神經(jīng)網(wǎng)絡(luò)的組成單位為神經(jīng)元,神經(jīng)元規(guī)則的連接形成網(wǎng)絡(luò)[5]。BP神經(jīng)網(wǎng)絡(luò)連接方式為全連接,即相鄰層神經(jīng)元相互連接,使權(quán)重偏置數(shù)量大。而卷積神經(jīng)網(wǎng)絡(luò)則憑借卷積層的區(qū)域連接以及混合層的壓縮,減少了參數(shù)數(shù)量,簡化了網(wǎng)絡(luò)結(jié)構(gòu)[6],使訓(xùn)練變的簡單。但作為BP神經(jīng)網(wǎng)絡(luò)研究的產(chǎn)物,也保留部分特性,仍離不開帶權(quán)輸入(z)與激活值(a)的計(jì)算。公式如式(1)、(2):
其中w為權(quán)重,b為偏置,l為當(dāng)前層,j、k為神經(jīng)元位置順序,x表示輸入神經(jīng)元數(shù)據(jù),σ為激活函數(shù),激活函數(shù)選擇Sigmoid 函數(shù),其特性可將激活值壓縮到(0,1)中[7]。
卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)主要由輸入層、卷積層、混合層、全連接層、輸出層五部分構(gòu)成。采用了3 種基本概念:卷積核、局部感受野、混合層。卷積核由共享權(quán)重與偏置組成,對(duì)應(yīng)不同的特征映射,用于卷積運(yùn)算,考慮到FPGA資源,該系統(tǒng)選擇一個(gè)卷積核。局部感受野與卷積核大小對(duì)應(yīng),表示區(qū)域性連接,區(qū)別于BP 的全連接?;旌蠈?,又稱池化層[8],可壓縮數(shù)據(jù)內(nèi)容,減小計(jì)算量。
傳統(tǒng)網(wǎng)絡(luò)結(jié)構(gòu)如圖1 所示。輸入層輸入圖片像素?cái)?shù)據(jù);卷積層,令卷積核數(shù)目為3,分別與像素?cái)?shù)據(jù)作卷積,得到3組數(shù)據(jù);混合層壓縮卷積層的輸出,每2×2矩陣可用平均數(shù)或最大值表示。上述對(duì)于3 個(gè)卷積核的卷積、混合運(yùn)算,利用硬件實(shí)現(xiàn)可同時(shí)完成,軟件則需分3次計(jì)算,體現(xiàn)了硬件實(shí)現(xiàn)并行性的優(yōu)點(diǎn)。之后兩層均為全連接,全連接層需將3 組神經(jīng)元矩陣轉(zhuǎn)換為1 組列矩陣,以便于綜合所有特征;最終計(jì)算輸出層的激活值,最大值所在的位置即判別結(jié)果[9]。
圖1 卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖
參數(shù)設(shè)置如下所示。
輸入層神經(jīng)元數(shù)量:28×28
卷積核大?。?×5
卷積層輸出:24×24(28?5+1)
混合層輸出:12×12
全連接層神經(jīng)元數(shù)量:100×1
輸出層神經(jīng)元數(shù)量:10×1
卷積神經(jīng)網(wǎng)絡(luò)一次完整的訓(xùn)練包括前向和反向傳播。前向傳播依靠權(quán)重與偏置計(jì)算帶權(quán)輸入和激活值,求得識(shí)別結(jié)果;反向傳播推導(dǎo)和優(yōu)化權(quán)重與偏置,以求高識(shí)別率。為使網(wǎng)絡(luò)的輸出能夠擬合所有的訓(xùn)練輸入,定義代價(jià)函數(shù)[10],公式如式(3):
式中,n為訓(xùn)練輸入個(gè)數(shù);y為標(biāo)簽值,a為輸出層的激活值。反向傳播的目的找到一系列讓代價(jià)函數(shù)C盡可能小的權(quán)重與偏置,采取梯度下降法來達(dá)到目的[11]。梯度下降需要引入神經(jīng)元誤差,公式可表示為代價(jià)函數(shù)對(duì)帶權(quán)輸入的偏導(dǎo),該過程存在激活函數(shù)導(dǎo)數(shù)。公式如式(4):
權(quán)重與偏置的更新梯度可表示為神經(jīng)元誤差對(duì)該層w、b的偏導(dǎo),公式如式(5)、(6)所示,由公式可得權(quán)重梯度可在偏置梯度基礎(chǔ)上求得。以梯度下降法計(jì)算更新梯度,原數(shù)據(jù)與梯度對(duì)應(yīng)相減,得到更新權(quán)重與偏置,反復(fù)訓(xùn)練,以求最高識(shí)別率:
網(wǎng)絡(luò)前向傳播輸入層需讀取圖片像素,網(wǎng)絡(luò)計(jì)算需讀取權(quán)重與偏置。初始化均值為0,方差為1 的高斯分布網(wǎng)絡(luò)權(quán)重與偏置。反向傳播需讀取標(biāo)簽值,標(biāo)簽值對(duì)應(yīng)輸入圖像的值。訓(xùn)練過程小批量處理,即輸入層一次訓(xùn)練輸入MNIST 數(shù)據(jù)庫中10 個(gè)樣本,將樣本像素?cái)?shù)據(jù)輸入到輸入層神經(jīng)元矩陣。
由于FPGA 不能夠識(shí)別小數(shù),所以,要經(jīng)過浮點(diǎn)轉(zhuǎn)定點(diǎn)處理,規(guī)定定點(diǎn)數(shù)位寬16 位,選擇S3.12 進(jìn)行轉(zhuǎn)換。其中S表示符號(hào)位,3為整數(shù)位個(gè)數(shù),12為小數(shù)位個(gè)數(shù)[12]。權(quán)重、偏置及標(biāo)簽值都應(yīng)擴(kuò)大4 095(位寬12 位)倍。以上均為有符號(hào)數(shù)。轉(zhuǎn)換定點(diǎn)數(shù)后進(jìn)行計(jì)算時(shí),注意位寬的匹配。
Verilog 語言存在數(shù)學(xué)運(yùn)算上的弊端,例如不能進(jìn)行矩陣運(yùn)算、不能夠識(shí)別對(duì)數(shù)、更不能夠計(jì)算導(dǎo)數(shù)等。為了設(shè)計(jì)的進(jìn)行,對(duì)曲線函數(shù)采用分段擬合近似表示。通過分割將每段曲線近似為直線,將曲線線性化[13]。卷積神經(jīng)網(wǎng)絡(luò)用到激活函數(shù)及其導(dǎo)數(shù),均可采用該方法處理。圖2 為Sigmoid 激活函數(shù)在區(qū)間(?6,6)的圖像,值域?yàn)椋?,1),且單調(diào)遞增。求解每段函數(shù)時(shí),可以借助Matlab 基本擬合功能。激活函數(shù)求導(dǎo)過程類似,不作講解。
圖2 Sigmoid函數(shù)
令分割區(qū)間為0.5,并進(jìn)行定點(diǎn)化,曲線代碼如下:
上述代碼將線性化函數(shù)的斜率、截距進(jìn)行浮點(diǎn)轉(zhuǎn)定點(diǎn)出理并以二進(jìn)制數(shù)表示,因此橫坐標(biāo)也要做出相應(yīng)調(diào)整。在(?6,6)兩端,因變量結(jié)果趨近于0、1。代碼中不再細(xì)分區(qū)間,直接令其值固定。將Sigmoid 函數(shù)及其導(dǎo)數(shù)作為底層,直接調(diào)用。
如圖3所示,輸入層排列為28×28的神經(jīng)元矩陣,卷積核大小為5×5,令跨度為1,卷積核與局部感受野對(duì)應(yīng)乘加,最終與共享偏置求和得到帶權(quán)輸入z,經(jīng)過激活函數(shù)得到激活值a,卷積后可得576 個(gè)神經(jīng)元,維數(shù)轉(zhuǎn)換后得下一層24×24的神經(jīng)元矩陣。
圖3 卷積計(jì)算結(jié)構(gòu)
卷積過程重點(diǎn)即提取矩陣中局部感受野。提取方法可對(duì)矩陣首個(gè)元素進(jìn)行控制,局部感受野其余元素均可導(dǎo)出。首元素移動(dòng),帶動(dòng)局部感受野移動(dòng)。因此,僅控制a、b即可。由時(shí)鐘控制a、b變化,直至掃描結(jié)束。
代碼如下:
因此,一個(gè)時(shí)鐘可得一組局部感受野,進(jìn)而與卷積核進(jìn)行卷積,最終求得帶權(quán)輸入與激活值,總耗時(shí)576個(gè)時(shí)鐘周期,得到卷積層輸出神經(jīng)元。
將卷積計(jì)算所得24×24 激活值矩陣劃分2×2 小矩陣,并將矩陣中四個(gè)數(shù)據(jù)用平均值一個(gè)數(shù)據(jù)表示[14],跨度為2,如圖4 所示。提取2×2 矩陣與局部感受野方式相同,每一個(gè)時(shí)鐘計(jì)算一組矩陣的平均值,耗時(shí)144 個(gè)時(shí)鐘周期,得到下一層12×12神經(jīng)元矩陣。該層不涉及權(quán)重與偏置,僅求激活值的平均數(shù)。
圖4 混合運(yùn)算結(jié)構(gòu)
卷積神經(jīng)網(wǎng)絡(luò)混合層之后連接方式均為全連接,神經(jīng)元排列由二維矩陣轉(zhuǎn)為一維矩陣。如圖5 所示,al-1表示混合層144 個(gè)神經(jīng)元,與下一層的100 個(gè)神經(jīng)元兩兩連接,求得帶權(quán)輸入與激活值;再與輸出層10個(gè)神經(jīng)元兩兩連接,計(jì)算求得輸出值。每個(gè)連接對(duì)應(yīng)一個(gè)權(quán)重,每個(gè)被連接神經(jīng)元對(duì)應(yīng)一個(gè)偏置,可見fully層權(quán)重、偏置個(gè)數(shù)為144×100、100;soft 層權(quán)重、偏置個(gè)數(shù)為100×10、10。
圖5 全連接輸出
該過程中,兩層計(jì)算方式相同,以計(jì)算fully 層帶權(quán)輸入為例。Verilog 不能進(jìn)行矩陣運(yùn)算,根據(jù)矩陣定義,在for 循環(huán)中需對(duì)應(yīng)好計(jì)算變量的位置。如圖6 所示,x_pool表示混合層神經(jīng)元,fully_w、fully_b表示該層權(quán)重、偏置,最終求得帶權(quán)輸afullyresult和激活值afullyresult,即圖5中
圖6 fully層仿真
帶權(quán)輸入代碼實(shí)現(xiàn)(fully層):
輸出層計(jì)算方式類似,100個(gè)激活值與10個(gè)神經(jīng)元全連接,最終獲得10個(gè)神經(jīng)元激活值。加入比較器,比較激活值的大小,大小所對(duì)應(yīng)的位置即檢測樣本數(shù)據(jù)。由于線性分割不夠精確,激活值存在相等的情況,可根據(jù)激活函數(shù)單調(diào)遞增特性,比較帶權(quán)輸入值即可。
前向傳播主要識(shí)別輸入樣本的值,即便采用一個(gè)卷積核,計(jì)算量仍較大,尤其在矩陣運(yùn)算時(shí),必須對(duì)應(yīng)好相乘的量。Verilog語言實(shí)現(xiàn)特點(diǎn)就是加入了時(shí)序,例如卷積層計(jì)算應(yīng)用576 時(shí)鐘周期、混合層144 時(shí)鐘周期等??偨Y(jié)前向傳播電路結(jié)構(gòu),如圖7所示,其中Sconv對(duì)應(yīng)卷積層、fully對(duì)應(yīng)全連接層、Soft對(duì)應(yīng)輸出層,給出每層的數(shù)據(jù)結(jié)構(gòu)。由權(quán)重、偏置計(jì)算帶權(quán)輸入,并求得激活值(池化層除外),激活值作為為下一層的輸入,經(jīng)過混合層、輸出層的計(jì)算,最終求得判別結(jié)果。
圖7 前向傳播電路結(jié)構(gòu)圖
反向傳播需讀取標(biāo)簽值y,與輸入樣本類似,每個(gè)訓(xùn)練周期讀取10個(gè)標(biāo)簽值。同樣標(biāo)簽值需進(jìn)行浮點(diǎn)轉(zhuǎn)定點(diǎn),因此列矩陣由0與4 095組成,標(biāo)簽值所在位置對(duì)應(yīng)4 095。仿真結(jié)果如圖8。
圖8 標(biāo)簽值讀取
權(quán)重與偏置共3 組,代碼中分別表示為:con_w、core_b(輸入層→卷積層),fully_w、fully_b(混合層→全連接層),soft_w、soft_b(全連接層→輸出層)。更新梯度主要依靠公式計(jì)算,以下根據(jù)代價(jià)函數(shù)及神經(jīng)元誤差定義所做出的公式推導(dǎo)、實(shí)現(xiàn)方案。
公式如式(7),(a-y) 對(duì)應(yīng)輸出激活值與標(biāo)簽值的差,為 10×1 列矩陣;asoftresult'表示asoftresult對(duì)softresult的導(dǎo)數(shù)(激活函數(shù)的導(dǎo)數(shù)),得10×1列矩陣;兩者點(diǎn)乘得到soft_b的更新梯度。
公式如式(8),包含soft_grad_b,為10×1 列矩陣,afullyresult激活值存于100×1列矩陣,兩個(gè)矩陣相乘不能得到soft_grad_w的100×10 矩陣。因此根據(jù)公式進(jìn)行計(jì)算不可行,需根據(jù)網(wǎng)絡(luò)結(jié)構(gòu)設(shè)定。令afullyresult的100×1 矩陣與soft_grad_b轉(zhuǎn)置后得到的 1×10 矩陣相乘。因前向過程中,afullyresult中100個(gè)神經(jīng)元與下一層10 個(gè)神經(jīng)元連接;反向過程10 個(gè)神經(jīng)元對(duì)應(yīng)值為soft_grad_b。因此,afullyresult中每一個(gè)仍與soft_grad_b中10個(gè)計(jì)算,滿足梯度對(duì)應(yīng)關(guān)系。
代碼實(shí)現(xiàn)的關(guān)鍵即處理矩陣運(yùn)算,必須要對(duì)應(yīng)好因數(shù)位置[15]。全連接層梯度的推導(dǎo)方式大同小異,以權(quán)重更新梯度計(jì)算為例。
代碼如下:
卷積神經(jīng)網(wǎng)絡(luò)一次訓(xùn)練十幅圖片,目的是在更新梯度時(shí),取平均得到較為準(zhǔn)確的更新梯度[16]。以上代碼即求得十組更新梯度。仿真結(jié)果如圖9。all表示梯度和,ave表示平均值,即真正更新梯度。與原始數(shù)據(jù)求差,得到更新值。
圖9 soft_w更新仿真
公式如式(9),soft_w為100 行10 列,此處不用更新值,矩陣乘積后得100×1矩陣,與afullyresult′(導(dǎo)數(shù))作點(diǎn)乘。計(jì)算結(jié)束后求平均值得到100個(gè)fully_b的更新梯度。
公式如式(10),結(jié)果是在fully_grad_b的100×1矩陣基礎(chǔ)上與混合層x_pool的144×1矩陣進(jìn)行乘積。同樣矩陣要進(jìn)行轉(zhuǎn)置,換序,與計(jì)算soft_grad_w原理相同,最終得到144×100矩陣。
以上為以全連接方式連接的權(quán)重與偏置梯度的推導(dǎo)。卷積層計(jì)算方式與以上不同,但也離不開前一層神經(jīng)元誤差。
卷積層誤差前向傳播時(shí),混合層將卷積層24×24神經(jīng)元矩陣壓縮為12×12。若要求得卷積層的誤差,首先求得混合層誤差,將混合層12×12 誤差矩陣恢復(fù)至24×24神經(jīng)元矩陣,處理稱為Unsample[17]?;旌嫌?jì)算利用平均值,展開過程將混合層的誤差除以4,分布到每一個(gè)2×2的矩陣中。舉例如圖10所示。
圖10 Unsample示例
卷積層與混合層之間不存在激活函數(shù),x_pool即帶權(quán)輸入z,所以fullyresult對(duì)x_pool求導(dǎo)時(shí)結(jié)果為1,如公式(11):
fully_grad_b為 100 行 1 列矩陣,fully_w為 144 行 100列,相乘得144 個(gè)神經(jīng)元誤差。進(jìn)行unsample 處理,為了計(jì)算方便,將誤差存入二維矩陣進(jìn)行擴(kuò)展,擴(kuò)展結(jié)果即卷積層神經(jīng)元誤差。
共享權(quán)重與偏置數(shù)目較少,梯度推導(dǎo)方式也有所不同。25個(gè)權(quán)重梯度依靠輸入圖片像素與卷積層誤差的卷積,即28×28矩陣卷積24×24矩陣,最終得到5×5的矩陣,對(duì)應(yīng)共享權(quán)重的梯度,公式如式(12);偏置梯度更為特殊,由于δ是高維張量,而core_b只是一個(gè)向量,通常的做法是將δ的各項(xiàng)分別求和,得到一個(gè)誤差向量[18],即為偏置更新梯度,公式如式(13):
反向傳播通過更新權(quán)重與偏置,使代價(jià)函數(shù)降到最低,以求最大識(shí)別率。主要工作為公式計(jì)算,難點(diǎn)在于對(duì)梯度下降法的原理、公式推導(dǎo)的理解;利用Verilog代碼實(shí)現(xiàn),難點(diǎn)在于解決矩陣的運(yùn)算、激活函數(shù)求導(dǎo)。該過程同樣以時(shí)序控制,總結(jié)反向傳播電路結(jié)構(gòu),如圖11所示,權(quán)重、偏置梯度倒序計(jì)算,各層數(shù)據(jù)結(jié)構(gòu)如圖。矩陣相乘、轉(zhuǎn)置對(duì)應(yīng)4.2節(jié)中的公式計(jì)算,可以看出前兩層的計(jì)算方式相同,計(jì)算輸入為帶權(quán)輸入、激活值以及原始權(quán)重,輸出為更新梯度。卷積層則依靠卷積、疊加計(jì)算方式求得更新梯度。提取全部更新梯度與原數(shù)據(jù)作差,求得更新值。該結(jié)構(gòu)可由一條總線連接,是因?yàn)楹笠粚拥奶荻扔汕耙粚犹荻惹蟮茫街锌梢泽w現(xiàn)。
圖11 反向傳播電路結(jié)構(gòu)圖
卷積神經(jīng)網(wǎng)絡(luò)一次完整的訓(xùn)練為10 幅圖片,實(shí)際應(yīng)用中需要訓(xùn)練MNIST 數(shù)據(jù)庫中所有圖片,因此在時(shí)鐘控制下,網(wǎng)絡(luò)的訓(xùn)練持續(xù)進(jìn)行。一次訓(xùn)練的周期約為850個(gè)時(shí)鐘周期,以時(shí)鐘控制,每850個(gè)時(shí)鐘周期輸入新的訓(xùn)練樣本,并更新權(quán)重與偏置。如圖12所示,每個(gè)周期的訓(xùn)練,僅需要上次更新的權(quán)重與偏置,因此,在提取出新的權(quán)重與偏置后,可認(rèn)為周期訓(xùn)練單獨(dú)運(yùn)行,互不影響。以計(jì)算fullyresult為例,如圖13所示,每850周期計(jì)算一組。
圖12 網(wǎng)絡(luò)時(shí)序結(jié)構(gòu)圖
圖13 fullyresult運(yùn)算仿真結(jié)果
在行為級(jí)描述及仿真正確的基礎(chǔ)上,進(jìn)一步進(jìn)行RTL 級(jí)設(shè)計(jì),以便進(jìn)行硬件測試,該設(shè)計(jì)針對(duì)Altera 芯片Cyclone?IV 4CE115 及友晶開發(fā)板DE2-115??紤]到芯片資源有限,將卷積神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行修改,卷積核由5×5 修改為3×3,全連接層由100 個(gè)神經(jīng)元修改為30個(gè)神經(jīng)元,小批量數(shù)據(jù)選擇3個(gè)樣本。訓(xùn)練系統(tǒng)框圖如圖14所示。
圖14 卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練系統(tǒng)框圖
樣本數(shù)據(jù)經(jīng)前向運(yùn)算、后向運(yùn)算后獲得權(quán)重梯度和偏置梯度,然后進(jìn)行權(quán)重、偏置更新,根據(jù)更新后的權(quán)重偏置繼續(xù)對(duì)新的樣本進(jìn)行訓(xùn)練,反復(fù)循環(huán)進(jìn)行。同時(shí)計(jì)算識(shí)別準(zhǔn)確率,當(dāng)準(zhǔn)確率達(dá)到設(shè)置的閾值時(shí),停止訓(xùn)練。由狀態(tài)機(jī)控制各個(gè)運(yùn)算過程的進(jìn)行,當(dāng)準(zhǔn)確率達(dá)到設(shè)置閾值時(shí),狀態(tài)機(jī)停止運(yùn)行。
由于樣本數(shù)據(jù)需要輸入電路進(jìn)行處理,故采用雙口RAM 存取樣本[19]。權(quán)重和偏置需要更新處理,也采用RAM 存取。經(jīng)過詳細(xì)分析處理過程,將一次訓(xùn)練過程分解為7個(gè)狀態(tài)。
S0:空閑狀態(tài)。
S1:卷積運(yùn)算,求卷積層帶權(quán)輸入;輸入新樣本(乒乓輸入)。
S2:池化運(yùn)算,求池化層激活函數(shù);求全鏈接層帶權(quán)輸入/激活值。
S3:輸出層帶權(quán)輸入/激活值;判決輸出;計(jì)算準(zhǔn)確率;求輸出層誤差;輸出層偏置梯度;更新輸出層偏置梯度。
S4:求全鏈接層誤差、全鏈接層偏置梯度;更新全連接層偏置。
S5:求全連接層權(quán)重梯度;更新全連接層權(quán)重;求池化層誤差;卷積層誤差,卷積層偏置梯度;更新卷積層偏置。
S6:求卷積層權(quán)重梯度;更新卷積層權(quán)重。
S7:停止?fàn)顟B(tài)。
時(shí)序圖如圖15。其中卷積層的卷積運(yùn)算及卷積層的權(quán)重梯度需要時(shí)間最長。
圖15 訓(xùn)練電路時(shí)序圖
根據(jù)時(shí)序分析,進(jìn)行狀態(tài)機(jī)設(shè)計(jì)。狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換圖如圖16 所示。S7 狀態(tài)即正確率達(dá)到設(shè)定閾值,停止訓(xùn)練,此時(shí)保留權(quán)重與偏置,直接用于識(shí)別數(shù)字即可。
圖16 狀態(tài)機(jī)狀態(tài)轉(zhuǎn)換圖
構(gòu)造卷積神經(jīng)網(wǎng)絡(luò),用于手寫數(shù)字的訓(xùn)練與識(shí)別。利用quartus II編寫 Verilog代碼并進(jìn)行編譯綜合,同時(shí)調(diào)用ModelSim 軟件進(jìn)行仿真,仿真結(jié)果如圖17 所示,compare 表示樣本標(biāo)簽,max_addr 表示識(shí)別值,right 表示正確識(shí)別的個(gè)數(shù),count 為表示訓(xùn)練的總樣本數(shù)計(jì)算準(zhǔn)確率,統(tǒng)計(jì)結(jié)果如表1。當(dāng)樣本數(shù)目為20 000時(shí),準(zhǔn)確率達(dá)到最大值95.4%,繼續(xù)訓(xùn)練識(shí)別率降低。分析原因,當(dāng)參量、類別過于復(fù)雜時(shí),神經(jīng)網(wǎng)絡(luò)訓(xùn)練時(shí)的收斂壓力則越大,效果降低。因此,合適的網(wǎng)絡(luò)參量數(shù)目是卷積神經(jīng)網(wǎng)絡(luò)達(dá)到良好實(shí)驗(yàn)結(jié)果的必要條件[20]。
圖17 行為級(jí)訓(xùn)練結(jié)果
卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練60 000樣本,將代碼下載至工作頻率可達(dá) 100 MHz 的 FPGA 中,訓(xùn)練耗時(shí)約 50 ms,而python訓(xùn)練耗時(shí)約8 min。因此速度顯著提高。對(duì)于硬件描述語言在數(shù)學(xué)計(jì)算上的缺點(diǎn),也得到了良好解決。即便存在浮點(diǎn)轉(zhuǎn)定點(diǎn)、激活值計(jì)算所造成的誤差,也并不影響識(shí)別結(jié)果。因此,以硬件實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò),保證了實(shí)時(shí)性、高準(zhǔn)確性。
表1 識(shí)別率統(tǒng)計(jì)結(jié)果
在Quartus II 13.0 中對(duì)RTL 級(jí)前向電路進(jìn)行了全編譯及硬件測試,選取訓(xùn)練好的權(quán)重和偏置,電路可正確識(shí)別樣本數(shù)據(jù)。網(wǎng)絡(luò)結(jié)構(gòu)在Quartus II 13.0 中進(jìn)行了邏輯綜合,并利用Modelsim-ASE進(jìn)行了仿真,正確率可達(dá)96%。該設(shè)計(jì)基于Intel 公司的Cyclone IV 系列FPGA 芯片EP4CE115F29C7N 進(jìn)行了驗(yàn)證,并在DE2-115 開發(fā)板上進(jìn)行了硬件測試,輸入樣本數(shù)字進(jìn)行識(shí)別測試,隨機(jī)選取樣本庫中數(shù)據(jù),灰度值排列如圖18 所示,連接數(shù)碼管引腳,直接顯示識(shí)別結(jié)果,完成數(shù)字識(shí)別,結(jié)果正確如圖19 所示。該設(shè)計(jì)可直接用于小型嵌入式系統(tǒng)進(jìn)行數(shù)字識(shí)別。
圖18 數(shù)字樣本
圖19 識(shí)別結(jié)果
本文以硬件描述語言(Verilog)實(shí)現(xiàn)卷積神經(jīng)網(wǎng)絡(luò),并以手寫數(shù)字識(shí)別為測試應(yīng)用。相較軟件實(shí)現(xiàn)而言,在保證準(zhǔn)確率的情況下,滿足了實(shí)時(shí)性的要求。盡管硬件描述語言在數(shù)學(xué)計(jì)算上存在缺點(diǎn),但也得到了很好的解決。實(shí)現(xiàn)過程存在浮點(diǎn)轉(zhuǎn)定點(diǎn)、激活值計(jì)算、求導(dǎo)所造成的誤差,對(duì)識(shí)別結(jié)果影響較小。卷積神經(jīng)網(wǎng)絡(luò)作為圖像識(shí)別的重要工具,要保證識(shí)別率足夠高,才可真正應(yīng)用于嵌入式設(shè)備,后續(xù)工作還需深入研究,例如增加網(wǎng)絡(luò)層數(shù)將準(zhǔn)確率再度提高或者實(shí)現(xiàn)其他識(shí)別應(yīng)用等。