超輕量Convolution設計指南



Original Source Here

Guidelines for Designing Lightweight Conv Methods

有了前面的比較對象及衡量方法後,我們就可以開始討論如何建構一個高速的低FLOPs卷積方法,大致上我們可以將輕量化的思路分為以下兩種:

Decouple Method(解藕法)

Conv-3×3的filter是一個三維矩陣,每計算一次就得進行3 x 3 x C 次的乘法運算,這一路線假設這其中有許多是不必要的冗餘計算,因此若能使特徵圖的平面空間(H,W)及深度空間(Channel)解藕運算,就能大幅減少FLOPs,其中最著名的方法Separable Conv(SprbConv)由Xception, MobileNet提出,他們主張由一個DepthWise Conv(DWConv)先進行純粹的平面卷積,再加上一個PointWise Conv(Conv-1×1)進行純粹的深度卷積,在實驗中與Conv-3×3得到近似的成效,為了簡單的評估FLOPs的差距,文章後面若非Conv-1×1將預設K=3並帶入前述提過的例子,從下式可以看到在這個例子底下SprbConv只有baseline 12.67%的FLOPs

FLOP_sprbconv = (H’ * W’ * C * K²) +(H’ * W’ * C * 1² * C’)

When in_ch=32, out_shape=(128,128,64), k=3:

MFLOP_sprbconv / MFLOP_conv = 36.5/288 = 0.1267

Divide and Conquer(分治法)

這個例子的G=3

ShuffleNet 提出的Group Conv將輸入的特徵圖在深度上劃分為𝐺個群組並分別通過卷積以提取特徵,這個方法可以減少的FLOPs相當直觀,甚至無須設設定條件,同下式可以看見只需要baseline 1/G的FLOPs。

FLOP_gconv = H’ * W’ * C/G * K² * C’/G

FLOP_gconv / FLOP_conv = (H’ W’ C/G K² C’/G) / (H’ W’ C K² C’) = 1/G

另外也有CSPNet提出的CSP Module及GhostNet提出的Ghost Module也採取了類似的方法,CSP Module在深度上將輸入的特徵圖一分為二,一半經過繁瑣的卷積,另一半則經過簡單的卷積或者乾脆移除卷積,Ghost Module則是更抽象的將部分輸出的特徵圖的深度視作冗餘,因此用繁瑣的卷積產生C’/T的channel,剩餘的冗餘channel使用(T-1)次簡單的卷積來產生,為了利於FLOPs的比較,我們假設"繁瑣的卷積"是Conv-3×3,"簡單的卷積"分別是Conv-1×1及DWConv,T則設為2,剩餘輸入輸出等尺寸則同前面例子,最後分別是baseline的27.78%及51.56%。

FLOP_cspm= (H’ * W’ * C/2 * K²* C’/2) + (H’ * W’ * C/2 * 1² * C’/2)

FLOP_ghstm= (H’ * W’ * C * K² * C’/T) + (T-1)(H’ * W’ * C’/T * K²)

When in_ch=32, out_shape=(128,128,64), K=3, T=2:

MFLOP_cspm / FLOP_conv = 80/288 =0.2778

MFLOP_ghstm/ FLOP_conv = 148.5/288 =0.5156

AI/ML

Trending AI/ML Article Identified & Digested via Granola by Ramsey Elbasheer; a Machine-Driven RSS Bot

%d bloggers like this: