關於卷積操作(Convolution)的理解(參數量和運算量計算),以及網絡輕量化(MobileNet Inspired Depthwise Separable Conv深度可分離卷積)

深度學習,尤其是深度卷積網絡的迅猛發展,使得其在存儲和算力奢侈的GPU(多GPU)上的部屬趨於成熟。然而,將基於深度CNN的方法有效移植到存儲和算力有限的移動設備端(手機、Pad、嵌入式設備等)面臨諸多挑戰。

核心挑戰就是如何降低CNN對memory(存儲)FLOPS(算力)的要求,但又保持CNN的性能(相比於其在GPU端的原貌)沒有顯著衰減。爲解決這一核心挑戰,我們就需要研究網絡輕量化,具體說就是通過設計新的網絡結構(archeticture)以及網絡中不淑的卷積操作(Conv Ops),以實現 1. 減少網絡參數量;2. 降低網絡運算過程中的FLOPs。

關於輕量化網絡的設計,八仙過海。這裏希望和大家分享我對Google開發的MobileNet(V1-V3)系列網絡的宏觀感受。個人水平有限,也沒有深入實現過MobileNet的各個版本,因此此處僅站在廣義CNN設計的角度彙報一下。

MobileNet的殺手鐗,是深度可分離卷積(Depthwise Separable Convolution)

For breviety,此博客把Depthwise Separable Conv簡稱爲DSC。

要理解DSC,我們先回溯普通卷積。

------------------------------------------------------------------------Here We Go--------------------------------------------------------------------------------

I. 普通卷積是如何操作的?普通卷積所產生的參數量和FLOPs如何計算?

爲粗糙的畫功向大家致歉。。。趕論文比較急,沒時間作圖了。、

Convolution的本質是feature localization,即,在input feature map上將某些local、局部的feature通過滑窗計算cross-correlation相似度的方式(注:cross-correlation和卷積實質上是把filter旋轉180度的關係),進行定位。該定位響應圖,就是某個feature的卷積輸出通道圖。

普通卷積,概述就是一個filter一次性完整地卷input feature map的所有通道,所以filter本身是由channel dimension的。而每一個filter在卷完之後的輸出是單通道的,所以該卷積層最後的輸出有多少通道,就需要在該卷積層設置多少個不同的filter(但沒一個fitler同樣尺寸和channel)。

1. 一個Conv操作所涉及的參數量是:

(Dk * Dk * M) * N-------每個卷積核參數 * N個核

Dk是卷積核尺寸(3、5、7等),M是輸入特徵通道數,N是輸出特徵通道數。

可見,一個CNN網絡architecture在設計時,如果有效控各個conv layer的制特徵圖channel數,以及卷積和空間大小,則有可能控制該CNN的整體參數量。卷積核尺寸越小、channel越淺,參數越少。

2. 一個Conv操作所涉及的計算量(所需算力)是:

(Dk * Dk * M * N)* Dw * DH

括號中是一個Conv的參數量。Conv在執行的時候是elementwise multiplciaiton then summation。所以一個Conv filter進行一次操作(即對input滑窗一遍)的計算量就是:

每個滑窗位置產生的計算量 * 滑窗位置的個數

由於是elementwise multiplicaiton + summation,所以每個滑窗位置產生的計算量 = 每個卷積核的參數量

所以一個卷積層操作的計算量等於其所有卷積核的參數量 * 輸入圖尺寸(假設SAME padding)。

如果選用SAME pading保持卷積輸入輸出空間尺寸不變,那麼滑窗位置的個數就等於輸入空間尺寸(可以理解爲,輸出圖上每個pixel的數值是conv filter在對應位置上進行cross-correlation計算所得的scalar數值)。

由此可見,卷積的計算量不僅與卷積核本身的尺寸、網絡中特徵圖channel數相關,還與網絡中特徵圖的空間尺寸相關。

所以,若輸入圖片大小固定,那麼CNN中conv層設計使得網絡中特徵圖尺寸越小(早、多pooling進行降採)+ 保持特徵圖通道數較小,則整個CNN的memeory和FLOPs較小。

但是,這明顯是約束該網絡的空間精細度(spatail fidelity)和語義深度(semantic depth)。好大的treade-off!

II. Spatialwise Separable Conv和DSC都可以對普通Conv實現輕量化。

Spatialwise Separable Conv就是將一個 空間大小3 * 3的filter拆解成先卷一個3 * 1 再卷一個1 * 3.

3 * 3 = 9,       3 * 1 + 1 * 3 = 6,          9 > 6

III. DSC

DSC是將一個普通卷積拆解爲先depthwise convolution(逐個通道單獨做輸入輸出均爲1 channel的卷積),再做pointwise convolution(通道數目調控)。

1. Depthwise conv的意義是將輸入feature map拆解爲各個單個通道,並在各個通道上做輸入輸出均爲1通道的卷積,所以一個DSC的depthwsie conv階段涉及到的參數爲:

(Dk * Dk) * M

括號中是每個單個通道上的filter的參數,M是M個通道。

2. pointwise conv是用1 * 1 conv filter將M輸入通道擴張到N輸出通道(Channel Manipulation)。

(1 * 1 * M) * N

括號中是用1 * 1 大小filter一齊卷M個channel的depthwise conv輸出,N是有N個這樣的1 * 1 * M個filters。

3. 一個DSC卷積層和一個普通Conv層總參數比較:Dk=3, M = 16, N = 32

DSC:Dk * Dk * M + 1 * 1 * M * N = 656

普通Conv:Dk * Dk * M * N = 4608

可見,DSC使參數減少是因爲迴避了使用N個M通道的“厚”卷積核,改爲使用M個“薄”單通道卷積核 + “厚”的1 * 1 卷積核。

即,迴避M * N這個參數主要來源直接與卷積核尺寸相乘。從這個角度上講,卷積核尺寸越大,DSC的輕量化效果越明顯。

4. DSC的計算量同樣時參數量 * input空間尺寸

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章