[深度學習] 深度可分離卷積

一 深度可分離卷積

深度可分離卷積之所以如此命名,是因爲它不僅處理空間維度,還處理深度維度-通道的數量。通常輸入圖像可以有3個通道:RGB。經過幾次卷積後,一個圖像可能有多個通道。你可以把每個頻道想象成那個圖像的一個特殊解釋;例如,“紅色”通道解釋每個像素的“紅色”,“藍色”通道解釋每個像素的“藍色”,“綠色”通道解釋每個像素的“綠色”。一個有64個頻道的圖像有64種不同的解釋。

深度可分離卷積將一個核分裂成兩個獨立的核,分別做兩個卷積:深度卷積和點向卷積。

標準的卷積過程可以看上圖,一個5×5的卷積核在卷積時,對應圖像區域中的所有通道均被同時考慮,問題在於,爲什麼一定要同時考慮圖像區域和通道?我們爲什麼不能把通道和空間區域分開考慮?

深度可分離卷積提出了一種新的思路:對於不同的輸入channel採取不同的卷積核進行卷積,它將普通的卷積操作分解爲兩個過程。

 卷積過程

假設有 的輸入,同時有 k個 3x3的卷積。如果設置 padding=1且 stride=1,那麼普通卷積輸出爲  。

Depthwise 過程

Depthwise是指將 的輸入分爲 C 組,然後每一組做 3x3卷積。這樣相當於收集了每個Channel的空間特徵,即Depthwise特徵。   輸出

Pointwise 過程

Pointwise是指對 的輸入(上面的輸出)做 k個普通的1x1卷積。這樣相當於收集了每個點的特徵,即Pointwise特徵。Depthwise+Pointwise最終輸出也是 .

 

二 實際例子

例子1

常規卷積操作

對於一張5×5像素、三通道(shape爲5×5×3),經過3×3卷積核的卷積層(假設輸出通道數爲4,則卷積核shape爲3×3×3×4,最終輸出4個Feature Map,如果有same padding則尺寸與輸入層相同(5×5),如果沒有則爲尺寸變爲3×3

卷積層共4個Filter,每個Filter包含了3個Kernel,每個Kernel的大小爲3×3。因此卷積層的參數數量可以用如下公式來計算:

N_std = 4 × 3 × 3 × 3 = 108

 

第1部分-深度卷積

Depthwise Convolution的一個卷積核負責一個通道,一個通道只被一個卷積核卷積

一張5×5像素、三通道彩色輸入圖片(shape爲5×5×3),Depthwise Convolution首先經過第一次卷積運算,DW完全是在二維平面內進行。卷積核的數量與上一層的通道數相同(通道和卷積核一一對應)。所以一個三通道的圖像經過運算後生成了3個Feature map(如果有same padding則尺寸與輸入層相同爲5×5),如下圖所示。

其中一個Filter只包含一個大小爲3×3的Kernel,卷積部分的參數個數計算如下:

N_depthwise = 3 × 3 × 3 = 27

Depthwise Convolution完成後的Feature map數量與輸入層的通道數相同,無法擴展Feature map。而且這種運算對輸入層的每個通道獨立進行卷積運算,沒有有效的利用不同通道在相同空間位置上的feature信息。因此需要Pointwise Convolution來將這些Feature map進行組合生成新的Feature map

第2部分-逐點卷積

Pointwise Convolution的運算與常規卷積運算非常相似,它的卷積核的尺寸爲 1×1×M,M爲上一層的通道數。所以這裏的卷積運算會將上一步的map在深度方向上進行加權組合,生成新的Feature map。有幾個卷積核就有幾個輸出Feature map

由於採用的是1×1卷積的方式,此步中卷積涉及到的參數個數可以計算爲:

N_pointwise = 1 × 1 × 3 × 4 = 12

經過Pointwise Convolution之後,同樣輸出了4張Feature map,與常規卷積的輸出維度相同

參數對比

回顧一下,常規卷積的參數個數爲:
N_std = 4 × 3 × 3 × 3 = 108

Separable Convolution的參數由兩部分相加得到:
N_depthwise = 3 × 3 × 3 = 27
N_pointwise = 1 × 1 × 3 × 4 = 12
N_separable = N_depthwise + N_pointwise = 39

相同的輸入,同樣是得到4張Feature map,Separable Convolution的參數個數是常規卷積的約1/3。因此,在參數量相同的前提下,採用Separable Convolution的神經網絡層數可以做的更深。

 

 

例子2

常規普通卷積

一個典型的圖像不是二維的;它也有深度,寬度和高度。假設我們有一個12x12x3像素的輸入圖像,大小爲12×12的RGB圖像。

我們對圖像做一個5×5的卷積,不加填充,步幅爲1。如果我們只考慮圖像的寬度和高度,卷積過程是這樣的:12×12 – (5×5) – >8×8。5×5內核每25個像素進行標量乘法,每次輸出一個數字。由於沒有填充(12-5 +1 = 8),我們最終得到一個8×8像素的圖像。

然而,由於圖像有3個通道,卷積核也需要有3個通道。這意味着,不是做5×5=25次乘法,而是每次內核移動時做5x5x3=75次乘法。

就像二維解釋一樣,我們對每25個像素做標量矩陣乘法,輸出一個數字。在經過5x5x3內核之後,12x12x3圖像將變成8x8x1圖像。

可分離卷積基本介紹

如果我們想增加輸出圖像中的通道數量呢?如果我們想要大小爲8x8x256的輸出呢?

我們可以創建256個內核來創建256個8x8x1圖像,然後將它們堆疊在一起,創建出8x8x256圖像輸出。

可分離卷積基本介紹

這就是正常卷積的工作原理。

我喜歡把它看做一個函數:12x12x3-(5x5x3x256)->8x8x256(其中5x5x3x256表示內核的高度、寬度、輸入通道數和輸出通道數)。並不是說這不是矩陣乘法;我們不是將整個圖像乘以內核,而是將內核移動到圖像的每個部分,並分別乘以圖像的小部分。

深度可分離卷積將這個過程分爲兩部分:深度卷積和點向卷積。

 

第1部分-深度卷積:

不使用padding, 並使用same

在第一部分深度卷積中,我們在不改變深度的情況下,對輸入圖像進行了反方向卷積。我們使用3個5x5x1形狀的內核。

可以參考一下視頻:https://youtu.be/D_VJoaSew7Q

可分離卷積基本介紹

每個5x5x1內核迭代圖像的1個通道(注意:1個通道,而不是所有通道),得到每25個像素組的標量積,得到一個8x8x1圖像。將這些圖像疊加在一起可創建8x8x3圖像。

 

第2部分-點向卷積:

記住,原始卷積將12x12x3圖像轉換爲8x8x256圖像。目前,深度卷積已經將12x12x3圖像轉換爲8x8x3圖像。現在,我們需要增加每個圖像的通道數。

點向卷積之所以如此命名是因爲它使用了一個1×1內核,或者說是一個遍歷每個點的內核。該內核有一個深度,不管輸入圖像有多少通道;在我們的例子中,它是3。因此,我們通過8x8x3圖像迭代1x1x3內核,得到8x8x1圖像。

可分離卷積基本介紹

我們可以創建256個1x1x3內核,每個內核輸出一個8x8x1圖像,以得到形狀爲8x8x256的最終圖像。

可分離卷積基本介紹

就這樣!我們把卷積分解成2:深度卷積和點向卷積。

更抽象地說,如果原始卷積函數是12x12x3 – (5x5x3x256)→8x8x256,

我們可以將這個新的卷積表示爲12x12x3 – (5x5x1x3) →8x8x3 – > (1x1x3x256) – >8x8x256。

 

三 深度可分離卷積優勢與創新

我們來計算一下計算機在原始卷積中要做的乘法的個數。有256個5x5x3內核可以移動8×8次。這是256x5x5x3x8x8 = 1228800 次乘法。

可分離卷積呢? 在深度卷積中,我們有3個5x5x1的內核它們移動了8×8次。也就是3x5x5x1x8x8 = 4800。在點向卷積中,我們有256個1x1x3的內核它們移動了8×8次。這是256x1x1x3x8x8 = 49152。把它們加起來,就是53952次乘法。

52,952比1,228,800小很多。計算量越少,網絡就能在更短的時間內處理更多的數據。

然而,這是如何實現的呢? 我第一次遇到這種解釋時,我的直覺並沒有真正理解它。這兩個卷積不是做同樣的事情嗎?在這兩種情況下,我們都通過一個5×5內核傳遞圖像,將其縮小到一個通道,然後將其擴展到256個通道。爲什麼一個的速度是另一個的兩倍多?

經過一段時間的思考,我意識到主要的區別是:在普通卷積中,我們對圖像進行了256次變換。每個變換都要用到5x5x3x8x8=4800次乘法。在可分離卷積中,我們只對圖像做一次變換——在深度卷積中。然後,我們將轉換後的圖像簡單地延長到256通道。不需要一遍又一遍地變換圖像,我們可以節省計算能力。

值得注意的是,在Keras和Tensorflow中,都有一個稱爲“深度乘數”的參數。默認設置爲1。通過改變這個參數,我們可以改變深度卷積中輸出通道的數量。例如,如果我們將深度乘法器設置爲2,每個5x5x1內核將輸出8x8x2的圖像,使深度卷積的總輸出(堆疊)爲8x8x6,而不是8x8x3。有些人可能會選擇手動設置深度乘法器來增加神經網絡中的參數數量,以便更好地學習更多的特徵。

深度可分離卷積是不是很棒?當然!因爲它減少了卷積中參數的數量,如果你的網絡已經很小,你可能會得到很少的參數,你的網絡可能無法在訓練中正確運作。然而,如果使用得當,它可以在適當的情況下提高效率,這使得它成爲一個非常受歡迎的選擇。

 

1×1 Kernels:

最後,由於點向卷積使用了這個概念,我想討論一下1×1內核的用法。

一個1×1內核——或者更確切地說,n個1x1xm內核,其中n是輸出通道的數量,m是輸入通道的數量——可以在可分離卷積之外使用。1×1內核的一個明顯目的是增加或減少圖像的深度。如果你發現卷積有太多或太少的通道,1×1核可以幫助平衡它。

然而,對我來說,1×1核的主要目的是應用非線性。在神經網絡的每一層之後,我們都可以應用一個激活層。無論是ReLU、PReLU、Softmax還是其他,與卷積層不同,激活層是非線性的。直線的線性組合仍然是直線。非線性層擴展了模型的可能性,這也是通常使“深度”網絡優於“寬”網絡的原因。爲了在不顯著增加參數和計算量的情況下增加非線性層的數量,我們可以應用一個1×1內核並在它之後添加一個激活層。這有助於給網絡增加一層深度。

 

 

 

參考:

http://www.atyun.com/39076.html

https://zhuanlan.zhihu.com/p/92134485

『高性能模型』深度可分離卷積和MobileNet_v1

 

 

發佈了173 篇原創文章 · 獲贊 226 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章