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

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

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

對于最簡單的F(n*m,r*s)
最傳統(tǒng)暴力的卷積運算:
時間成本: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


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

由于是3x3卷積核,且步長為1。因此,循環(huán)取出A、B、C、D、E這5個子矩陣,每個矩陣的維度都是: 輸入高度x3
將A、B、C、D、E按照行優(yōu)先展開并拼成一個大的中間矩陣L, L的維度則為:5x21。從L中循環(huán)取出P、Q、R、S、T這5個子矩陣,并計算5次矩陣乘法,就得到了最終的結(jié)果。從上面的示例中我們不難看出,MEC的解決思路在于將im2col這一過程分成了Height和Width兩部分,于是需要存儲的中間矩陣也大大減小了??赡軒淼膯栴}就是,原來的一次矩陣乘法,現(xiàn)在會變成多次小矩陣乘法。雖然有利于并行計算,但也失去了BLAS庫計算大矩陣乘法的優(yōu)勢。
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高級版
考慮了batchsize和channel

Winograd方法
說完了這些方法,我們來說說Winograd方法吧,加速卷積的不二之選。本文重在于利用Winograd方法加速卷積,順便選取內(nèi)存和速度兼顧的方案
公式的推導(dǎo),這里選用F( 3 *3,2*2)
用多項式的中國剩余定理推導(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中的眾矩陣通過從[C_out,3,3,C] -> [C_out,6,6,C]


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


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



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