本發(fā)明涉及計算機(jī)視覺領(lǐng)域,特別涉及一種神經(jīng)網(wǎng)絡(luò)優(yōu)化方法及裝置。
背景技術(shù):
近幾年來,深度神經(jīng)網(wǎng)絡(luò)在計算機(jī)視覺領(lǐng)域的各類應(yīng)用中取得了巨大的成功,如圖像分類、目標(biāo)檢測、圖像分割等。
但深度神經(jīng)網(wǎng)絡(luò)的模型往往包含大量的模型參數(shù),計算量大、處理速度慢,無法在一些低功耗、低計算能力的設(shè)備(如嵌入式設(shè)備、集成設(shè)備等)上進(jìn)行實(shí)時計算。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述問題,本發(fā)明提供一種神經(jīng)網(wǎng)絡(luò)優(yōu)化方法及裝置,以解決現(xiàn)有技術(shù)神經(jīng)網(wǎng)絡(luò)計算速度慢、實(shí)時性差的問題。
本發(fā)明實(shí)施例,一方面提供一種神經(jīng)網(wǎng)絡(luò)優(yōu)化方法,該方法包括:
將卷積層的輸入數(shù)據(jù)沿著通道方向進(jìn)行二值化和位打包操作,得到壓縮輸入數(shù)據(jù);
將所述卷積層的各卷積核分別沿著通道方向進(jìn)行二值化和位打包操作得到相應(yīng)的壓縮卷積核;
將所述壓縮輸入數(shù)據(jù)按照卷積運(yùn)算順序依次劃分為與壓縮卷積核大小相同的數(shù)據(jù)塊,一次卷積運(yùn)算包含的輸入數(shù)據(jù)構(gòu)成一個數(shù)據(jù)塊;
將所述壓縮輸入數(shù)據(jù)的每個數(shù)據(jù)塊依次與各壓縮卷積核進(jìn)行卷積運(yùn)算得到卷積結(jié)果,并根據(jù)卷積結(jié)果得到所述卷積層的多個輸出數(shù)據(jù)。
本發(fā)明實(shí)施例,另一方面提供一種神經(jīng)網(wǎng)絡(luò)優(yōu)化裝置,該裝置包括:
第一數(shù)據(jù)處理單元,用于將卷積層的輸入數(shù)據(jù)沿著通道方向進(jìn)行二值化和位打包操作,得到壓縮輸入數(shù)據(jù);
第二數(shù)據(jù)處理單元,用于將所述卷積層的各卷積核分別沿著通道方向進(jìn)行二值化和位打包操作得到相應(yīng)的壓縮卷積核;
卷積單元,用于將所述壓縮輸入數(shù)據(jù)的每個數(shù)據(jù)塊依次與各壓縮卷積核進(jìn)行卷積運(yùn)算,得到卷積結(jié)果;
輸出單元,用于根據(jù)所述卷積結(jié)果得到所述卷積層的多個輸出數(shù)據(jù)。
本發(fā)明技術(shù)方案帶來以下技術(shù)效果:
1、在實(shí)際應(yīng)用中,卷積層的輸入數(shù)據(jù)一般為三維數(shù)據(jù)、卷積核為四維數(shù)據(jù),其通道數(shù)非常大,若直接采用卷積核對輸入數(shù)據(jù)進(jìn)行卷積運(yùn)算其運(yùn)算量非常大,速度較低。而本發(fā)明提供的方案,將卷積層的輸入數(shù)據(jù)和各卷積核分別沿著通道方向進(jìn)行二值化和位打包操作得到壓縮輸入數(shù)據(jù)和壓縮卷積核,不僅在通道方向?qū)斎霐?shù)據(jù)和各卷積核進(jìn)行數(shù)據(jù)壓縮使得參與卷積運(yùn)算的數(shù)據(jù)量大大減少,而且輸入數(shù)據(jù)與卷積核的卷積運(yùn)算由現(xiàn)有技術(shù)的浮點(diǎn)數(shù)與浮點(diǎn)數(shù)相乘變成了無符號整數(shù)與無符號整數(shù)之間的按位操作,提高了卷積運(yùn)算速度;且cpu擅長按位操作,因此本發(fā)明技術(shù)方案優(yōu)化后的神經(jīng)網(wǎng)絡(luò)更加適用于在cpu上實(shí)現(xiàn)實(shí)時計算;
2、在現(xiàn)有技術(shù)中,對輸入數(shù)據(jù)與卷積核進(jìn)行卷積運(yùn)算的實(shí)現(xiàn)方式一般為,將輸入數(shù)據(jù)和卷積核這兩個張量展開為二維矩陣,進(jìn)行矩陣乘法運(yùn)算,再將矩陣乘法運(yùn)算結(jié)果重新排布成張量,該現(xiàn)有技術(shù),一方面需要額外分配內(nèi)存來存儲展開的矩陣,增加內(nèi)存開銷,另一方面需要將矩陣乘法運(yùn)算得到的運(yùn)算結(jié)果重新排布成張量,耗時較長、速度慢。而本發(fā)明技術(shù)方案,直接將壓縮輸入數(shù)據(jù)劃分成數(shù)據(jù)塊,將每個數(shù)據(jù)塊與各壓縮卷積核進(jìn)行卷積運(yùn)算的結(jié)果直接按順序存儲到輸出張量上,以形成輸出數(shù)據(jù),無需像現(xiàn)有技術(shù)需要增加內(nèi)存開銷存儲矩陣和消耗時長對運(yùn)算結(jié)果進(jìn)行重新排布,因此,采用本發(fā)明技術(shù)方案既節(jié)省內(nèi)存開銷而且還進(jìn)一步提高運(yùn)算速度。
附圖說明
附圖用來提供對本發(fā)明的進(jìn)一步理解,并且構(gòu)成說明書的一部分,與本發(fā)明的實(shí)施例一起用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的限制。
圖1為本發(fā)明實(shí)施例提供的神經(jīng)網(wǎng)絡(luò)優(yōu)化方法的流程圖之一;
圖2為本發(fā)明實(shí)施例為輸入數(shù)據(jù)和其對應(yīng)的壓縮輸入數(shù)據(jù)的示意圖;
圖3為本發(fā)明實(shí)施例中卷積核和其對應(yīng)的壓縮卷積核的示意圖;
圖4a為本發(fā)明實(shí)施例中壓縮輸入數(shù)據(jù)的數(shù)據(jù)塊的示意圖;
圖4b為本發(fā)明實(shí)施例中通道數(shù)據(jù)與通道卷積的示意圖;
圖5為本發(fā)明實(shí)施例提供的神經(jīng)網(wǎng)絡(luò)優(yōu)化方法的流程圖之二;
圖6a為本發(fā)明實(shí)施例為卷積層的輸出數(shù)據(jù)分配存儲空間的示意圖;
圖6b為本發(fā)明實(shí)施例得到卷積層的輸出數(shù)據(jù)的示意圖;
圖7為本發(fā)明實(shí)施例提供的神經(jīng)網(wǎng)絡(luò)優(yōu)化方法的流程圖之三;
圖8為本發(fā)明實(shí)施例中全連接層的輸入數(shù)據(jù)和其對應(yīng)的輸入數(shù)據(jù)序列的示意圖;
圖9a為本發(fā)明實(shí)施例中全連接層的網(wǎng)絡(luò)權(quán)重的示意圖;
圖9b為本發(fā)明實(shí)施例中轉(zhuǎn)置后的網(wǎng)絡(luò)權(quán)重的示意圖;
圖9c為本發(fā)明實(shí)施例中經(jīng)過二值化處理和位打包操作之后的網(wǎng)絡(luò)權(quán)重;
圖10為本發(fā)明實(shí)施例中神經(jīng)網(wǎng)絡(luò)優(yōu)化裝置的結(jié)構(gòu)示意圖之一;
圖11為本發(fā)明實(shí)施例中神經(jīng)網(wǎng)絡(luò)優(yōu)化裝置的結(jié)構(gòu)示意圖之二;
圖12為本發(fā)明實(shí)施例中神經(jīng)網(wǎng)絡(luò)優(yōu)化裝置的結(jié)構(gòu)示意圖之三。
具體實(shí)施方式
為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明中的技術(shù)方案,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本發(fā)明保護(hù)的范圍。
實(shí)施例一
參見圖1,為本發(fā)明實(shí)施例提供的神經(jīng)網(wǎng)絡(luò)優(yōu)化方法的流程圖,本實(shí)施例一對神經(jīng)網(wǎng)絡(luò)的卷積層進(jìn)行處理,該方法包括:
步驟101、將卷積層的輸入數(shù)據(jù)沿著通道方向進(jìn)行二值化和位打包操作,得到壓縮輸入數(shù)據(jù)。
卷積層的輸入數(shù)據(jù)一般為三維數(shù)據(jù),其包括輸入數(shù)據(jù)的高、寬和通道數(shù),其中輸入數(shù)據(jù)的通道數(shù)較多,一般為32的倍數(shù)。如圖2所示為輸入數(shù)據(jù)和該輸入數(shù)據(jù)對應(yīng)的壓縮輸入數(shù)據(jù)的示意圖,用h表示輸入數(shù)據(jù)的高,用w表示輸入數(shù)據(jù)的寬,用c表示輸入數(shù)據(jù)的通道數(shù);壓縮輸入數(shù)據(jù)的高、寬不變,但壓縮輸入數(shù)據(jù)的通道數(shù)變?yōu)閏/m,其中m為32的整數(shù)倍,例如m取值為32、64、128、256等等,本申請不做嚴(yán)格限定。
步驟102、將所述卷積層的各卷積核分別沿著通道方向進(jìn)行二值化和位打包操作得到相應(yīng)的壓縮卷積核。
卷積層的卷積核一般為四維數(shù)據(jù),其包括卷積核的高、寬、通道數(shù)和卷積核個數(shù),多個卷積核的高、寬、通道數(shù)相同,且各卷積核的通道數(shù)與輸入數(shù)據(jù)的通道數(shù)相同,一般為32的倍數(shù)。如圖3為卷積核和該卷積核對應(yīng)的壓縮卷積核的示意圖,用h表示卷積核的高,用w表示卷積核的寬,用c表示卷積核的通道數(shù),壓縮卷積核的高、寬不變,但壓縮卷積核的通道數(shù)變?yōu)閏/m。
步驟103、將所述壓縮輸入數(shù)據(jù)按照卷積運(yùn)算順序依次劃分為與壓縮卷積核大小相同的數(shù)據(jù)塊,一次卷積運(yùn)算包含的輸入數(shù)據(jù)構(gòu)成一個數(shù)據(jù)塊。
將壓縮輸入數(shù)據(jù)分成如圖4a所示的數(shù)據(jù)塊。該數(shù)據(jù)塊為三維數(shù)據(jù),該數(shù)據(jù)塊的高為h,寬為w,通道數(shù)為c/m。
假設(shè)壓縮輸入數(shù)據(jù)為5*5*6,壓縮卷積核為3*3*6,則一個數(shù)據(jù)塊為3*3*6,若卷積步長為1則將該壓縮輸入數(shù)據(jù)劃分成9個數(shù)據(jù)塊。
步驟104、將所述壓縮輸入數(shù)據(jù)的每個數(shù)據(jù)塊依次與各壓縮卷積核進(jìn)行卷積運(yùn)算得到卷積結(jié)果。
步驟105、根據(jù)卷積結(jié)果得到所述卷積層的多個輸出數(shù)據(jù)。
本發(fā)明實(shí)施例中,步驟105得到的每個輸出數(shù)據(jù)為一張二維張量。上一層卷積層的卷積核的數(shù)量為下一層網(wǎng)絡(luò)的輸入數(shù)據(jù)的通道數(shù),上一層卷積層的每一個輸出數(shù)據(jù)為下一層網(wǎng)絡(luò)的一個通道輸入數(shù)據(jù)。
優(yōu)選地,前述步驟101,具體實(shí)現(xiàn)可通過以下步驟a1~步驟a2實(shí)現(xiàn):
步驟a1、將所述卷積層的輸入數(shù)據(jù)沿著通道方向進(jìn)行二值化處理得到二值化輸入數(shù)據(jù);
本發(fā)明實(shí)施例中,可以通過以下公式(1)所示的二值化方法進(jìn)行二值化處理:
當(dāng)然,本發(fā)明并僅限于前述公式(1)所示的二值化方法進(jìn)行二值化處理,還可以采用其他二值化方法進(jìn)行二值化處理,例如,將取值大于等于0的數(shù)據(jù)二值化為+1,將取值小于0的數(shù)據(jù)二值化為0。
步驟a2、從二值化輸入數(shù)據(jù)的第一個數(shù)據(jù)開始,將每m個連續(xù)數(shù)據(jù)打包成一個數(shù)據(jù),所述m為32的整數(shù)倍。
假設(shè)二值化輸入數(shù)據(jù)包含256個數(shù)據(jù),m為32,則可將該二值化輸入數(shù)據(jù)打包成8個長度為32位的整型數(shù)據(jù)。
優(yōu)選地,前述步驟102,針對所述卷積層的每一個卷積核,通過以下步驟b1~步驟b2實(shí)現(xiàn):
步驟b1、將卷積核沿著通道方向進(jìn)行二值化得到二值化卷積核;
步驟b2、從二值化卷積核的第一個數(shù)據(jù)開始,將每m個連續(xù)數(shù)據(jù)打包成一個數(shù)據(jù)。
優(yōu)選地,所述步驟104具體實(shí)現(xiàn)如下:
對所述壓縮輸入數(shù)據(jù)的每個數(shù)據(jù)塊與每個壓縮卷積核進(jìn)行以下卷積運(yùn)算,該卷積運(yùn)算包括以下步驟c1~步驟c2:
步驟c1、將所述數(shù)據(jù)塊在每個通道上的通道數(shù)據(jù)與所述壓縮卷積核中相應(yīng)通道上的通道卷積核進(jìn)行內(nèi)積運(yùn)算,以得到每個通道數(shù)據(jù)與相應(yīng)通道卷積核的內(nèi)積結(jié)果;
步驟c2、將所述數(shù)據(jù)塊的各個通道數(shù)據(jù)與相應(yīng)通道卷積核的內(nèi)積結(jié)果的和值,確定為所述數(shù)據(jù)塊與所述壓縮卷積核的卷積結(jié)果。
本發(fā)明實(shí)施例中,前述通道數(shù)據(jù)包含多個數(shù)據(jù)元素,所述卷積核包含多個卷積元素,前述步驟c1中將所述數(shù)據(jù)塊在每個通道上的通道數(shù)據(jù)與所述壓縮卷積核中相應(yīng)通道上的通道卷積核進(jìn)行內(nèi)積運(yùn)算,具體實(shí)現(xiàn)可如下:
針對每個通道數(shù)據(jù)執(zhí)行以下步驟d1~步驟d2:
步驟d1、將通道數(shù)據(jù)中的每個數(shù)據(jù)元素與相應(yīng)通道卷積核中的相應(yīng)卷積元素進(jìn)行包含一次異或操作和bit-count操作的內(nèi)積運(yùn)算,得到各數(shù)據(jù)元素與相應(yīng)卷積元素的內(nèi)積結(jié)果;
其中bit-count操作是指統(tǒng)計1的個數(shù)。
步驟d2、根據(jù)所述通道數(shù)據(jù)中各數(shù)據(jù)元素與相應(yīng)卷積元素的內(nèi)積結(jié)果,得到所述通道數(shù)據(jù)與相應(yīng)通道卷積核的內(nèi)積結(jié)果。
根據(jù)以下公式(2)計算得到通道數(shù)據(jù)與相應(yīng)卷積核的內(nèi)積結(jié)果:
式(2)中,xi·wi為xi與wi的內(nèi)積結(jié)果,xi為為數(shù)據(jù)塊在第i個通道的通道數(shù)據(jù),wi為壓縮卷積核在第i個通道的通道卷積核,xij為通道數(shù)據(jù)中的第j個數(shù)據(jù)元素,wij為wi中的第j個卷積元素,k為通道數(shù)據(jù)包含的數(shù)據(jù)元素個數(shù),n為k×m。
如圖4b所示為數(shù)據(jù)塊的第i個通道的通道數(shù)據(jù)以及壓縮卷積核中第i個通道的通道卷積核,通道數(shù)據(jù)和通道卷積核的大小相同,該通道數(shù)據(jù)與通道卷積核的寬為w,高為h,均包含k(k=w*h)個元素。
在深度神經(jīng)網(wǎng)絡(luò)中為防止卷積帶來的圖像縮減問題,現(xiàn)有技術(shù)在將輸入數(shù)據(jù)與卷積核進(jìn)行卷積時,將輸入數(shù)據(jù)和卷積核這兩個張量展開成二維矩陣,并將輸入數(shù)據(jù)展開的二維矩陣中進(jìn)行邊緣補(bǔ)零,由于輸入數(shù)據(jù)展開的二維矩陣比較大,因此內(nèi)存開銷較大,且邊緣補(bǔ)零操作需要一定的時延。
優(yōu)選地,為解決現(xiàn)有技術(shù)邊緣補(bǔ)零的技術(shù)問題,本發(fā)明實(shí)施例,在前述圖1所示的方法流程中,還包括以下步驟100,如圖5所示:
步驟100、為所述卷積層的多個輸出數(shù)據(jù)分別分配一個大小為(h’+2n)*(w’+2n)的存儲空間,其中h’為輸出數(shù)據(jù)的高,w’為輸出數(shù)據(jù)的寬,n為需要在輸出數(shù)據(jù)周圍補(bǔ)零的圈數(shù)。
此時,前述步驟105具體實(shí)現(xiàn)可如下:將所述壓縮輸入數(shù)據(jù)的各數(shù)據(jù)塊與同一個壓縮卷積核進(jìn)行卷積運(yùn)算得到的卷積結(jié)果作為同一個輸出數(shù)據(jù)的元素,分別存儲在該輸出數(shù)據(jù)對應(yīng)的存儲空間的中間位置。
如圖6a所示,假設(shè)卷積層的輸出數(shù)據(jù)為3個,用第一輸出數(shù)據(jù)、第二輸出數(shù)據(jù)和第三輸出數(shù)據(jù)表示,則為該3個輸出數(shù)據(jù)分別分配1個大小為(h’+2n)*(w’+2n)的存儲空間,分別用存儲空間a、存儲空間b和存儲空間c表示,且存儲空間a、存儲空間b和存儲空間c中的數(shù)據(jù)的初始值為0。卷積層包含壓縮卷積核a、壓縮卷積核b和壓縮卷積核c。如圖6b所示,壓縮輸入數(shù)據(jù)的各數(shù)據(jù)塊與壓縮卷積核a進(jìn)行卷積運(yùn)算所得到的卷積結(jié)果構(gòu)成第一輸出數(shù)據(jù),該第一輸出數(shù)據(jù)存儲在對應(yīng)的存儲空間a中的中間位置(用x表示的區(qū)域);壓縮輸入數(shù)據(jù)的各數(shù)據(jù)塊與壓縮卷積核b進(jìn)行卷積運(yùn)算所得到的卷積結(jié)果構(gòu)成第二輸出數(shù)據(jù),該第二輸出數(shù)據(jù)存儲在對應(yīng)的存儲空間b中的中間位置(用x表示的區(qū)域);壓縮輸入數(shù)據(jù)的各數(shù)據(jù)塊與壓縮卷積核c進(jìn)行卷積運(yùn)算所得到的卷積結(jié)果構(gòu)成第三輸出數(shù)據(jù),該第三輸出數(shù)據(jù)存儲在對應(yīng)的存儲空間c的中間位置(用x表示的區(qū)域)。由于第一輸出數(shù)據(jù)、第二輸出數(shù)據(jù)和第三輸出數(shù)據(jù)的大小為h*w,則存儲空間a、存儲空間b和存儲空間c的邊緣為0,達(dá)到了輸出數(shù)據(jù)邊緣補(bǔ)零的效果,不需要額外開銷內(nèi)存也不需要進(jìn)行補(bǔ)零操作,解決了現(xiàn)有技術(shù)邊緣補(bǔ)零所存在的技術(shù)問題。
本發(fā)明技術(shù)方案帶來以下技術(shù)效果:
1、在實(shí)際應(yīng)用中,卷積層的輸入數(shù)據(jù)一般為三維數(shù)據(jù)、卷積核為四維數(shù)據(jù),其通道數(shù)非常大,若直接采用卷積核對輸入數(shù)據(jù)進(jìn)行卷積運(yùn)算其運(yùn)算量非常大,速度較低。而本發(fā)明提供的方案,將卷積層的輸入數(shù)據(jù)和各卷積核分別沿著通道方向進(jìn)行二值化和位打包操作得到壓縮輸入數(shù)據(jù)和壓縮卷積核,不僅在通道方向?qū)斎霐?shù)據(jù)和各卷積核進(jìn)行數(shù)據(jù)壓縮使得參與卷積運(yùn)算的數(shù)據(jù)量大大減少,而且輸入數(shù)據(jù)與卷積核的卷積運(yùn)算由現(xiàn)有技術(shù)的浮點(diǎn)數(shù)與浮點(diǎn)數(shù)相乘變成了無符號整數(shù)與無符號整數(shù)之間的按位操作,提高了卷積運(yùn)算速度;且cpu擅長按位操作,因此本發(fā)明技術(shù)方案優(yōu)化后的神經(jīng)網(wǎng)絡(luò)更加適用于在cpu上實(shí)現(xiàn)實(shí)時計算;
2、在現(xiàn)有技術(shù)中,對輸入數(shù)據(jù)與卷積核進(jìn)行卷積運(yùn)算的實(shí)現(xiàn)方式一般為,將輸入數(shù)據(jù)和卷積核這兩個張量展開為二維矩陣,進(jìn)行矩陣乘法運(yùn)算,再將矩陣乘法運(yùn)算結(jié)果重新排布成張量,該現(xiàn)有技術(shù),一方面需要額外分配內(nèi)存來存儲展開的矩陣,增加內(nèi)存開銷,另一方面需要將矩陣乘法運(yùn)算得到的運(yùn)算結(jié)果重新排布成張量,耗時較長、速度慢。而本發(fā)明技術(shù)方案,直接將壓縮輸入數(shù)據(jù)劃分成數(shù)據(jù)塊,將每個數(shù)據(jù)塊與各壓縮卷積核進(jìn)行卷積運(yùn)算的結(jié)果直接按順序存儲到輸出張量上,以形成輸出數(shù)據(jù),無需像現(xiàn)有技術(shù)需要增加內(nèi)存開銷存儲矩陣和消耗時長對運(yùn)算結(jié)果進(jìn)行重新排布,因此,采用本發(fā)明技術(shù)方案既節(jié)省內(nèi)存開銷而且還進(jìn)一步提高運(yùn)算速度。
優(yōu)選地,為進(jìn)一步提高對神經(jīng)網(wǎng)絡(luò)的優(yōu)化效果,以提高神經(jīng)網(wǎng)絡(luò)處理效果,在前述實(shí)施例一的基礎(chǔ)上,還進(jìn)一步對神經(jīng)網(wǎng)絡(luò)中的全連接層進(jìn)行處理,對全連接層的處理具體可詳見實(shí)施例二部分的內(nèi)容。
當(dāng)神經(jīng)網(wǎng)絡(luò)包含卷積層不包含全連接層時,采用實(shí)施例一的方式對神經(jīng)網(wǎng)絡(luò)中的卷積層進(jìn)行處理;當(dāng)神經(jīng)網(wǎng)絡(luò)包含全連接層不包含卷積層時,采用實(shí)施例二的方式對神經(jīng)網(wǎng)絡(luò)中的全連接層進(jìn)行處理;當(dāng)神經(jīng)網(wǎng)絡(luò)既包含全連接層也包含卷積層時,采用實(shí)施例一的方式對神經(jīng)網(wǎng)絡(luò)的卷積層進(jìn)行處理,采用實(shí)施例二的方式對神經(jīng)網(wǎng)絡(luò)的全連接層進(jìn)行處理。
實(shí)施例二
參見圖7,為本發(fā)明實(shí)施例提供的神經(jīng)網(wǎng)絡(luò)優(yōu)化方法的流程示意圖,該方法包括步驟701~步驟709,其中步驟701~步驟705對神經(jīng)網(wǎng)絡(luò)中的卷積層進(jìn)行處理,與圖1所示的步驟101~步驟105一一對應(yīng),相應(yīng)的具體實(shí)現(xiàn)方式參見實(shí)施例一,在此不再贅述。步驟706~步驟709對神經(jīng)網(wǎng)絡(luò)中的全連接層進(jìn)行處理,該步驟706~步驟709與步驟701~步驟705之間的先后順序沒有嚴(yán)格的限定,根據(jù)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)確定,例如神經(jīng)網(wǎng)絡(luò)包含的網(wǎng)絡(luò)層依次為卷積層a、卷積層b、全連接層c、卷積層d和全連接層e,則按照該神經(jīng)網(wǎng)絡(luò)包含的網(wǎng)絡(luò)層順序依次對各卷積層采用步驟701~步驟705處理、對各全連接層采用步驟706~步驟708處理。
步驟701、將卷積層的輸入數(shù)據(jù)沿著通道方向進(jìn)行二值化和位打包操作,得到壓縮輸入數(shù)據(jù)。
步驟702、將所述卷積層的各卷積核分別沿著通道方向進(jìn)行二值化和位打包操作得到相應(yīng)的壓縮卷積核。
步驟703、將所述壓縮輸入數(shù)據(jù)按照卷積運(yùn)算順序依次劃分為與壓縮卷積核大小相同的數(shù)據(jù)塊,一次卷積運(yùn)算包含的輸入數(shù)據(jù)構(gòu)成一個數(shù)據(jù)塊。
步驟704、將所述壓縮輸入數(shù)據(jù)的每個數(shù)據(jù)塊依次與各壓縮卷積核進(jìn)行卷積運(yùn)算得到卷積結(jié)果;
步驟705、根據(jù)卷積結(jié)果得到所述卷積層的多個輸出數(shù)據(jù)。
步驟706、對全連接層的輸入數(shù)據(jù)進(jìn)行二值化和位打包操作得到包含多個數(shù)據(jù)元素的輸入數(shù)據(jù)序列。
步驟707、將所述全連接層的網(wǎng)絡(luò)權(quán)重進(jìn)行轉(zhuǎn)置,對轉(zhuǎn)置后的每一行權(quán)重進(jìn)行二值化和位打包操作得到包含多個權(quán)重元素的權(quán)重序列。
步驟708、將輸入數(shù)據(jù)序列中的數(shù)據(jù)元素分別與各行權(quán)重序列的權(quán)重元素進(jìn)行內(nèi)積運(yùn)算,得到輸入數(shù)據(jù)序列與各行權(quán)重序列的內(nèi)積結(jié)果。
步驟709、根據(jù)輸入數(shù)據(jù)序列與各行權(quán)重序列的內(nèi)積結(jié)果得到所述全連接層的輸出結(jié)果。
優(yōu)選地,本發(fā)明實(shí)施例中,前述步驟706,具體可通過以下步驟e1~步驟e2實(shí)現(xiàn):
步驟e1、對輸入數(shù)據(jù)進(jìn)行二值化處理得到二值化輸入數(shù)據(jù);
步驟e2、從二值化輸入數(shù)據(jù)的第一個數(shù)據(jù)開始,將每m個連續(xù)數(shù)據(jù)打包成一個數(shù)據(jù)元素得到包含多個數(shù)據(jù)元素的輸入數(shù)據(jù)序列,m為32的整數(shù)倍。
m的取值可以為32、64、128、256等等,本申請不作嚴(yán)格限定。
如圖8所示為全連接層的輸入數(shù)據(jù)、以及該輸入數(shù)據(jù)對應(yīng)的輸入數(shù)據(jù)序列的示意圖,輸入數(shù)據(jù)的長度為n,輸入數(shù)據(jù)序列的長度為n/m。
優(yōu)選地,前述步驟707中,對轉(zhuǎn)置后的每一行權(quán)重進(jìn)行二值化和位打包操作得到包含多個權(quán)重元素的權(quán)重序列,具體可通過以下步驟f1~步驟f2實(shí)現(xiàn):
步驟f1、對一行權(quán)重進(jìn)行二值化處理得到一行二值化權(quán)重;
步驟f2、從該行二值化權(quán)重的第一個權(quán)重開始,將每m個連續(xù)權(quán)重打包成一個權(quán)重元素得到包含多個權(quán)重元素的權(quán)重序列。
如圖9a所示為全連接層的網(wǎng)絡(luò)權(quán)重示意圖,網(wǎng)絡(luò)權(quán)重包含n行和h列,圖9b為轉(zhuǎn)置后的網(wǎng)絡(luò)權(quán)重示意圖,圖9c為經(jīng)過二值化處理和位打包操作之后的網(wǎng)絡(luò)權(quán)重。
優(yōu)選地,前述步驟708具體可通過以下步驟g1~步驟g2實(shí)現(xiàn):
步驟g1、將每一行權(quán)重序列的每個權(quán)重元素與相應(yīng)數(shù)據(jù)元素進(jìn)行包含一次異或操作和bit-count操作的內(nèi)積運(yùn)算,以得到每個權(quán)重元素與相應(yīng)數(shù)據(jù)元素的內(nèi)積結(jié)果。
步驟g2、根據(jù)一行權(quán)重序列的各權(quán)重元素與相應(yīng)元素的內(nèi)積結(jié)果,得到輸入數(shù)據(jù)序列與該行權(quán)重序列的內(nèi)積結(jié)果。
根據(jù)以下公式(3)計算得到輸入數(shù)據(jù)序列與一行權(quán)重序列的內(nèi)積結(jié)果:
式(3)中,x·wi為輸入數(shù)據(jù)序列與第i行權(quán)重序列的內(nèi)積結(jié)果,x為輸入數(shù)據(jù)序列,wi為第i行權(quán)重序列,n為輸入數(shù)據(jù)的數(shù)量,xj為輸入數(shù)據(jù)序列中第j個數(shù)據(jù)元素,wij為第i行權(quán)重序列中第j個權(quán)重元素。
在計算機(jī)程序代碼中,針對輸入數(shù)據(jù)序列與一行權(quán)重序列,需要進(jìn)行n/m次乘法和累加運(yùn)算,若采用循環(huán)語句則需要判斷n/m次,循環(huán)開銷較大。
優(yōu)選地,為節(jié)省循環(huán)開銷,本發(fā)明實(shí)施例中,針對輸入數(shù)據(jù)序列與一行權(quán)重序列,為每一對需要進(jìn)行卷積運(yùn)算的數(shù)據(jù)元素和權(quán)重元素配置一個內(nèi)積運(yùn)算執(zhí)行指令,即設(shè)置n/m個內(nèi)積運(yùn)算執(zhí)行指令,直接根據(jù)該n/m個內(nèi)積運(yùn)算執(zhí)行指令分別對n/m對數(shù)據(jù)元素和權(quán)重元素進(jìn)行內(nèi)積運(yùn)算,無需進(jìn)行循環(huán)判斷,節(jié)省循環(huán)開銷。因此,在前述步驟708中還包括以下步驟:
步驟g0、為每行權(quán)重序列的每個權(quán)重元素配置相應(yīng)的一個內(nèi)積運(yùn)算執(zhí)行指令;
此時,前述步驟g1具體實(shí)現(xiàn)如下:按照權(quán)重元素在一行權(quán)重序列中的先后順序,根據(jù)權(quán)重元素對應(yīng)的內(nèi)積運(yùn)算執(zhí)行指令對該權(quán)重元素與相應(yīng)數(shù)據(jù)元素進(jìn)行包含一次異或操作和bit-count操作的內(nèi)積運(yùn)算。
神經(jīng)網(wǎng)絡(luò)的全連接層的w維一般是256的整數(shù)倍(例如alexnet第一個全連接層中w=4096,vggnet第一個全連接層中w=25088),avx提供的256位長度指令集可進(jìn)一步加速二值化向量與矩陣的乘法,因此,本發(fā)明實(shí)施例,可將輸入數(shù)據(jù)和一行權(quán)重進(jìn)行256位打包操作,即每256個連續(xù)的數(shù)據(jù)打包成一個avx支持的256位長度整型數(shù)據(jù),用_mm256_xor_si256指令對兩個256位長度整型數(shù)據(jù)進(jìn)行按位異或操作,再通過4次_mm_popcnt_u64指令累加得到上一步運(yùn)算結(jié)果中1的總個數(shù)。
優(yōu)選地,為進(jìn)一步提高輸入數(shù)據(jù)序列與各行權(quán)重序列的內(nèi)積運(yùn)算速度,本發(fā)明實(shí)施例,將各行權(quán)重序列與輸入數(shù)據(jù)序列的內(nèi)積運(yùn)算分布到cpu(centralprocessingunit,中央處理器)的多個核上進(jìn)行并行處理,由cpu的各個核對分配到該核上的輸入數(shù)據(jù)序列和行權(quán)重序列進(jìn)行前述內(nèi)積運(yùn)算,并輸出內(nèi)積運(yùn)算的內(nèi)積結(jié)果。例如,假設(shè)行權(quán)重序列總共為h個,cpu包含k個核,可以是直接將該h個行權(quán)重序列平均分配到k個核上,由該k個核分別依次對其分配得到的h/k個行權(quán)重序列與輸入數(shù)據(jù)序列進(jìn)行內(nèi)積運(yùn)算;還可以是根據(jù)該k個核的負(fù)載量分配相應(yīng)比例數(shù)量的行權(quán)重序列。本申請不做嚴(yán)格限定。
本發(fā)明實(shí)施例二中,在對卷積層進(jìn)行處理得到的相應(yīng)技術(shù)效果的基礎(chǔ)上,還帶來以下兩個技術(shù)效果:一方面,將神經(jīng)網(wǎng)絡(luò)的全連接層的輸入數(shù)據(jù)和網(wǎng)絡(luò)權(quán)重進(jìn)行二值化和位打包操作得到輸入數(shù)據(jù)序列和權(quán)重序列,不僅對輸入數(shù)據(jù)和網(wǎng)絡(luò)權(quán)重進(jìn)行數(shù)據(jù)壓縮使得參與運(yùn)算的數(shù)據(jù)量大大減少,而且輸入數(shù)據(jù)與網(wǎng)絡(luò)權(quán)重的運(yùn)算由現(xiàn)有技術(shù)的浮點(diǎn)數(shù)與浮點(diǎn)數(shù)相乘變成了無符號整數(shù)與無符號整數(shù)之間的按位操作,提高了運(yùn)算速度;另一方面,對網(wǎng)絡(luò)權(quán)重進(jìn)行轉(zhuǎn)置之后的每一行權(quán)重處理成一行權(quán)重序列,從而使得輸入數(shù)據(jù)序列可以直接按行與網(wǎng)絡(luò)權(quán)重的每一行權(quán)重序列依次進(jìn)行內(nèi)積運(yùn)算,從而加快矩陣乘法的數(shù)據(jù)讀取速度,從而進(jìn)一步提高內(nèi)積運(yùn)算速度;再一方面,在將輸入數(shù)據(jù)序列與一行權(quán)重序列進(jìn)行卷積運(yùn)算時,直接根據(jù)各個數(shù)據(jù)元素的內(nèi)積運(yùn)算執(zhí)行指令進(jìn)行數(shù)據(jù)元素與相應(yīng)權(quán)重元素的內(nèi)積運(yùn)算,無需循環(huán)判斷,節(jié)省循環(huán)開銷;最后一方面,通過cpu的多個核并行處理輸入數(shù)據(jù)序列與各行權(quán)重序列的內(nèi)積運(yùn)算,進(jìn)一步提高輸入數(shù)據(jù)序列與各行權(quán)重序列的內(nèi)積運(yùn)算速度和效率。
實(shí)施例三
基于前述實(shí)施例一、實(shí)施例二提供的神經(jīng)網(wǎng)絡(luò)優(yōu)化方法的相同思想,本發(fā)明實(shí)施例三提供一種神經(jīng)網(wǎng)絡(luò)優(yōu)化裝置,該裝置的結(jié)構(gòu)示意圖如圖10所示。
第一數(shù)據(jù)處理單元11,用于將卷積層的輸入數(shù)據(jù)沿著通道方向進(jìn)行二值化和位打包操作,得到壓縮輸入數(shù)據(jù);
第二數(shù)據(jù)處理單元12,用于將所述卷積層的各卷積核分別沿著通道方向進(jìn)行二值化和位打包操作得到相應(yīng)的壓縮卷積核;
劃分單元13,用于將所述壓縮輸入數(shù)據(jù)按照卷積運(yùn)算順序依次劃分為與壓縮卷積核大小相同的數(shù)據(jù)塊,一次卷積運(yùn)算包含的輸入數(shù)據(jù)構(gòu)成一個數(shù)據(jù)塊;
卷積單元14,用于將所述壓縮輸入數(shù)據(jù)的每個數(shù)據(jù)塊依次與各壓縮卷積核進(jìn)行卷積運(yùn)算,得到卷積結(jié)果;
輸出單元15,用于根據(jù)所述卷積結(jié)果得到所述卷積層的多個輸出數(shù)據(jù)。
前述第一數(shù)據(jù)處理單元11和第二數(shù)據(jù)處理單元12可通過但不僅限于前述公式(1)所示的二值化方法進(jìn)行二值化處理,在此不再贅述。
優(yōu)選地,所述卷積單元14具體用于:對所述壓縮輸入數(shù)據(jù)的每個數(shù)據(jù)塊與每個壓縮卷積核進(jìn)行以下卷積運(yùn)算:
將所述數(shù)據(jù)塊在每個通道上的通道數(shù)據(jù)與所述壓縮卷積核中相應(yīng)通道上的通道卷積核進(jìn)行內(nèi)積運(yùn)算,以得到每個通道數(shù)據(jù)與相應(yīng)通道卷積核的內(nèi)積結(jié)果;
將所述數(shù)據(jù)塊的各個通道數(shù)據(jù)與相應(yīng)通道卷積核的內(nèi)積結(jié)果的和值,確定為所述數(shù)據(jù)塊與所述壓縮卷積核的卷積結(jié)果。
優(yōu)選地,所述通道數(shù)據(jù)包含多個數(shù)據(jù)元素,所述通道卷積核包含多個卷積元素;
所述卷積單元14將所述數(shù)據(jù)塊在每個通道上的通道數(shù)據(jù)與所述壓縮卷積核中相應(yīng)通道上的通道卷積核進(jìn)行內(nèi)積運(yùn)算,具體包括:
針對每個通道數(shù)據(jù)執(zhí)行以下步驟:
將通道數(shù)據(jù)中的每個數(shù)據(jù)元素與相應(yīng)通道卷積核中的相應(yīng)卷積元素進(jìn)行包含一次異或操作和bit-count操作的內(nèi)積運(yùn)算,得到各數(shù)據(jù)元素與相應(yīng)卷積元素的內(nèi)積結(jié)果;
根據(jù)所述通道數(shù)據(jù)中各數(shù)據(jù)元素與相應(yīng)卷積元素的內(nèi)積結(jié)果,得到所述通道數(shù)據(jù)與相應(yīng)通道卷積核的內(nèi)積結(jié)果。
具體可根據(jù)前述公式(2)計算得到通道數(shù)據(jù)與相應(yīng)卷積核的內(nèi)積結(jié)果,在此不再贅述。
優(yōu)選地,所述裝置還可進(jìn)一步包括分配單元16,如圖11所示:
分配單元16,用于為所述卷積層的多個輸出數(shù)據(jù)分別分配一個大小為(h’+2n)*(w’+2n)的存儲空間,其中h’為輸出數(shù)據(jù)的高,w’為輸出數(shù)據(jù)的寬,n為需要在輸出數(shù)據(jù)周圍補(bǔ)零的圈數(shù);
輸出單元15具體用于:將所述壓縮輸入數(shù)據(jù)的各數(shù)據(jù)塊與同一個壓縮卷積核進(jìn)行卷積運(yùn)算得到的卷積結(jié)果作為同一個輸出數(shù)據(jù)的元素,分別存儲在該輸出數(shù)據(jù)對應(yīng)的存儲空間的中間位置。
優(yōu)選地,所述第一數(shù)據(jù)處理單元11,具體用于:將所述卷積層的輸入數(shù)據(jù)沿著通道方向進(jìn)行二值化處理得到二值化輸入數(shù)據(jù);從二值化輸入數(shù)據(jù)的第一個數(shù)據(jù)開始,將每m個連續(xù)數(shù)據(jù)打包成一個數(shù)據(jù),所述m為32的整數(shù)倍;
優(yōu)選地,所述第二數(shù)據(jù)處理單元12,具體用于:針對每個卷積核,將所述卷積核沿著通道方向進(jìn)行二值化得到二值化卷積核;從二值化卷積核的第一個數(shù)據(jù)開始,將每m個連續(xù)數(shù)據(jù)打包成一個數(shù)據(jù)。
優(yōu)選地,如圖10、圖11所示的裝置,還可進(jìn)一步包括第三數(shù)據(jù)處理單元17、權(quán)重處理單元18、內(nèi)積運(yùn)算單元19、結(jié)果輸出單元20,如圖12所示在圖10所示的裝置中包含前述單元,其中:
第三數(shù)據(jù)處理單元17,用于對全連接層的輸入數(shù)據(jù)進(jìn)行二值化和位打包操作得到包含多個數(shù)據(jù)元素的輸入數(shù)據(jù)序列;
權(quán)重處理單元18,用于將所述全連接層的網(wǎng)絡(luò)權(quán)重進(jìn)行轉(zhuǎn)置,對轉(zhuǎn)置后的每一行權(quán)重進(jìn)行二值化和位打包操作得到包含多個權(quán)重元素的權(quán)重序列;
內(nèi)積運(yùn)算單元19,用于將輸入數(shù)據(jù)序列中的數(shù)據(jù)元素分別與各行權(quán)重序列的權(quán)重元素進(jìn)行內(nèi)積運(yùn)算,得到輸入數(shù)據(jù)序列與各行權(quán)重序列的內(nèi)積結(jié)果;
結(jié)果輸出單元20,用于根據(jù)輸入數(shù)據(jù)序列與各行權(quán)重序列的內(nèi)積結(jié)果得到所述全連接層的輸出結(jié)果。
優(yōu)選地,所述內(nèi)積運(yùn)算單元19包括:
內(nèi)積運(yùn)算模塊,用于將每一行權(quán)重序列的每個權(quán)重元素與相應(yīng)數(shù)據(jù)元素進(jìn)行包含一次異或操作和bit-count操作的內(nèi)積運(yùn)算,以得到每個權(quán)重元素與相應(yīng)數(shù)據(jù)元素的內(nèi)積結(jié)果;
確定模塊,用于根據(jù)一行權(quán)重序列的各權(quán)重元素與相應(yīng)元素的內(nèi)積結(jié)果,得到輸入數(shù)據(jù)序列與該行權(quán)重序列的內(nèi)積結(jié)果。
具體可根據(jù)前述公式(3)計算得到輸入數(shù)據(jù)序列與一行權(quán)重序列的內(nèi)積結(jié)果,在此不再贅述。
優(yōu)選地,為進(jìn)一步節(jié)省循環(huán)開銷,所述內(nèi)積運(yùn)算單元19還進(jìn)一步包括:
指令生成模塊,用于為每行權(quán)重序列的每個權(quán)重元素配置相應(yīng)的一個內(nèi)積運(yùn)算執(zhí)行指令;
內(nèi)積運(yùn)算模塊具體用于:按照權(quán)重元素在一行權(quán)重序列中的先后順序,根據(jù)權(quán)重元素對應(yīng)的內(nèi)積運(yùn)算執(zhí)行指令對該權(quán)重元素與相應(yīng)數(shù)據(jù)元素進(jìn)行包含一次異或操作和bit-count操作的內(nèi)積運(yùn)算。
優(yōu)選地,所述內(nèi)積運(yùn)算單元19,具體用于:將各行權(quán)重序列與輸入數(shù)據(jù)序列的內(nèi)積運(yùn)算,分布到cpu的多個核上進(jìn)行并行處理,從所述多個核中得到輸入數(shù)據(jù)序列與各行權(quán)重序列的內(nèi)積結(jié)果。
優(yōu)選地,所述第三數(shù)據(jù)處理單元17具體用于:對輸入數(shù)據(jù)進(jìn)行二值化處理得到二值化輸入數(shù)據(jù);從二值化輸入數(shù)據(jù)的第一個數(shù)據(jù)開始,將每m個連續(xù)數(shù)據(jù)打包成一個數(shù)據(jù)元素得到包含多個數(shù)據(jù)元素的輸入數(shù)據(jù)序列,所述m為32的整數(shù)倍。
優(yōu)選地,所述權(quán)重處理單元18對轉(zhuǎn)置后的每一行權(quán)重進(jìn)行二值化和位打包操作得到包含多個權(quán)重元素的權(quán)重序列,具體包括:對一行權(quán)重進(jìn)行二值化處理得到一行二值化權(quán)重;從該行二值化權(quán)重的第一個權(quán)重開始,將每m個連續(xù)權(quán)重打包成一個權(quán)重元素得到包含多個權(quán)重元素的權(quán)重序列。
以上是本發(fā)明的核心思想,為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明實(shí)施例中的技術(shù)方案,并使本發(fā)明實(shí)施例的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖對本發(fā)明實(shí)施例中技術(shù)方案作進(jìn)一步詳細(xì)的說明。
顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進(jìn)行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。