手撕 | 深度神經(jīng)網(wǎng)絡(luò)卷積層計(jì)算加速與優(yōu)化
重磅干貨,第一時(shí)間送達(dá)

重磅干貨,第一時(shí)間送達(dá)

閱讀本文大概需要 6 min 左右
傳統(tǒng)卷積層計(jì)算
首先我們定義符號(hào)F()函數(shù)為卷積函數(shù)
一維卷積:F(n,m)
n代表輸出的維度,m代表濾波器的維度
二維卷積:F(n*m,r*s)
n*m代表輸出的維度,r*s代表濾波器的維度
下面我們具體談?wù)勧槍?duì)二維的卷積加速
傳統(tǒng)的卷積層加速:

對(duì)于最簡(jiǎn)單的F(n*m,r*s)
最傳統(tǒng)暴力的卷積運(yùn)算:
時(shí)間成本:1. 乘法:(n*m*r*s)2. 加法:(n*m*(r – 1)*(s – 1))空間成本:1. 輸入層:(n+r-1)*(m + s - 1)2. 卷積核:(r*s)
Imcol+GEMM
為了更好的理解,首先給出這幅圖:

推廣到三維,也就是Image:C*H*W


最后一頁(yè)沒(méi)畫(huà),但是基本上就是Filter Matrix乘以Feature Matrix的轉(zhuǎn)置,得到輸出矩陣Cout x (H x W),就可以解釋為輸出的三維Blob(Cout x H x W)。
相對(duì)于傳統(tǒng)的暴力的卷積算法而言,此算法將卷積變成了矩陣乘法,為加速提供了便捷條件,能很容易用硬件實(shí)現(xiàn)加速。但是內(nèi)存有冗余。
Imcol+MEC初級(jí)版

由于是3x3卷積核,且步長(zhǎng)為1。因此,循環(huán)取出A、B、C、D、E這5個(gè)子矩陣,每個(gè)矩陣的維度都是: 輸入高度x3
將A、B、C、D、E按照行優(yōu)先展開(kāi)并拼成一個(gè)大的中間矩陣L, L的維度則為:5x21。從L中循環(huán)取出P、Q、R、S、T這5個(gè)子矩陣,并計(jì)算5次矩陣乘法,就得到了最終的結(jié)果。從上面的示例中我們不難看出,MEC的解決思路在于將im2col這一過(guò)程分成了Height和Width兩部分,于是需要存儲(chǔ)的中間矩陣也大大減小了。可能帶來(lái)的問(wèn)題就是,原來(lái)的一次矩陣乘法,現(xiàn)在會(huì)變成多次小矩陣乘法。雖然有利于并行計(jì)算,但也失去了BLAS庫(kù)計(jì)算大矩陣乘法的優(yōu)勢(shì)。
F( n*m,r*s)原本內(nèi)存:( n+r – 1) *( m+s – 1)Imcol+GEMM轉(zhuǎn)換需要內(nèi)存大?。簉 * s * n * mImcol+MEC初版需要內(nèi)存大?。簃 * ( r * ( n + s – 1 ) )
Imcol+MEC高級(jí)版
考慮了batchsize和channel

Winograd方法
說(shuō)完了這些方法,我們來(lái)說(shuō)說(shuō)Winograd方法吧,加速卷積的不二之選。本文重在于利用Winograd方法加速卷積,順便選取內(nèi)存和速度兼顧的方案
公式的推導(dǎo),這里選用F( 3 *3,2*2)
用多項(xiàng)式的中國(guó)剩余定理推導(dǎo)可知:




在其中,我用的是F( 4 * 4 , 3 * 3 )
輸入的tensor:[N,W,H,C]
卷積核的tensor:[C_out,kernal_W,kernel_H,C_in]

圖中K = C_out、T = N
Kernals中的眾矩陣通過(guò)從[C_out,3,3,C] -> [C_out,6,6,C]


是一個(gè)變形后的卷積核,kernal1 = [1,6,6,128],上圖中有128個(gè)卷積核,因?yàn)檩敵龅腡ensor:[N,W,H,128],拋開(kāi)上面具體的實(shí)例,為了推導(dǎo)后續(xù)公式,這里我們只研究
對(duì)于輸入矩陣16X16、卷積核 3X3,采用 F( 4 X 4,3X3 ) 的加速方案:
明確輸出矩陣14 X 14 首先將卷積核通過(guò)GgG(T)變成 6X6的矩陣D


現(xiàn)在的問(wèn)題變成了如何將點(diǎn)乘的集合變成更簡(jiǎn)易可表達(dá)的形式。再看下面這幅圖:



故我們得到的最后的結(jié)果是:
所以最后我們統(tǒng)計(jì)一下所作的乘法:
X 3 X 128 X 14 X 14 = 225792X 6 X 128 X 16 = 73728/ 73728 = 3.0625
改進(jìn):如若有剩余,考慮用其他矩陣相乘方法
好消息!
小白學(xué)視覺(jué)知識(shí)星球
開(kāi)始面向外開(kāi)放啦??????
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺(jué)、目標(biāo)跟蹤、生物視覺(jué)、超分辨率處理等二十多章內(nèi)容。 下載2:Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目52講 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):Python視覺(jué)實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺(jué)實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺(jué)。 下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講 在「小白學(xué)視覺(jué)」公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。 交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~
