可分離卷積
任何看過MobileNet架構的人都會遇到可分離卷積(separable convolutions)這個概念。但什么是“可分離卷積”,它與標准的卷積又有什么區別?可分離卷積主要有兩種類型:空間可分離卷積和深度可分離卷積。
1. 空間可分離卷積
從概念上講,這是兩者中較容易的一個,並說明了將一個卷積分成兩部分(兩個卷積核)的想法,所以我將從這開始。 不幸的是,空間可分離卷積具有一些顯着的局限性,這意味着它在深度學習中沒有被大量使用。
空間可分卷積之所以如此命名,是因為它主要處理圖像和卷積核(kernel)的空間維度:寬度和高度。 (另一個維度,“深度”維度,是每個圖像的通道數)。
空間可分離卷積簡單地將卷積核划分為兩個較小的卷積核。 最常見的情況是將3x3的卷積核划分為3x1和1x3的卷積 核,如下所示:
圖1:在空間上分離3x3內核
現在,我們不是用9次乘法進行一次卷積,而是進行兩次卷積,每次3次乘法(總共6次),以達到相同的效果。 乘法較少,計算復雜性下降,網絡運行速度更快。
圖2:簡單且空間可分離的卷積
最著名的可在空間上分離的卷積是用於邊緣檢測的sobel卷積核:
圖3:分離的Sobel卷積核
在一個可分離卷積中,我們可以將內核操作拆分成多個步驟。我們用y = conv(x,k)表示卷積,其中y是輸出圖像,x是輸入圖像,k是內核。這一步很簡單。接下來,我們假設k可以由下面這個等式計算得出:k = k1.dot(k2)。這將使它成為一個可分離的卷積,因為我們可以通過對k1和k2做2個一維卷積來取得相同的結果,而不是用k做二維卷積。
圖4. Sobel X和Y濾鏡
空間可分卷積的主要問題是並非所有卷積核都可以“分離”成兩個較小的卷積核。 這在訓練期間變得特別麻煩,因為網絡可能采用所有可能的卷積核,它最終只能使用可以分成兩個較小卷積核的一小部分。
比起卷積,空間可分離卷積要執行的矩陣乘法運算也更少。假設我們現在在 m x m 卷積核、卷積步長=1 、填充=0 的 N x N 圖像上做卷積。傳統的卷積需要進行 (N-2) x (N-2) x m x m 次乘法運算,而空間可分離卷積只需要進行 N x (N-2) x m + (N-2) x (N-2) x m = (2N-2) x (N-2) x m 次乘法運算。空間可分離卷積與標准的卷積的計算成本之比為:
2. 深度可分離卷積
與空間可分離卷積不同,深度可分離卷積與卷積核無法“分解”成兩個較小的內核。 因此,它更常用。 這是在keras.layers.SeparableConv2D或tf.layers.separable_conv2d中看到的可分離卷積的類型。
深度可分離卷積之所以如此命名,是因為它不僅涉及空間維度,還涉及深度維度(信道數量)。 輸入圖像可以具有3個信道:R、G、B。 在幾次卷積之后,圖像可以具有多個信道。 你可以將每個信道想象成對該圖像特定的解釋說明(interpret); 例如,“紅色”信道解釋每個像素的“紅色”,“藍色”信道解釋每個像素的“藍色”,“綠色”信道解釋每個像素的“綠色”。 具有64個通道的圖像具有對該圖像的64種不同解釋。
類似於空間可分離卷積,深度可分離卷積將卷積核分成兩個單獨的卷積核,這兩個卷積核進行兩個卷積:深度卷積和逐點卷積。 但首先,讓我們看看正常的卷積是如何工作的。
空間可分離卷積,而在深度學習中,深度可分離卷積將執行一個空間卷積,同時保持通道獨立,然后進行深度卷積操作。
假設我們在一個16輸入通道和32輸出通道上有一個3x3的卷積層。那么將要發生的就是16個通道中的每一個都由32個3x3的內核進行遍歷,從而產生512(16x32)的特征映射。接下來,我們通過將每個輸入通道中的特征映射相加從而合成一個大的特征映射。由於我們可以進行此操作32次,因此我們得到了期望的32個輸出通道。
那么,針對同一個示例,深度可分離卷積的表現又是怎樣的呢?我們遍歷16個通道,每一個都有一個3x3的內核,可以給出16個特征映射。現在,在做任何合並操作之前,我們將遍歷這16個特征映射,每個都含有32個1x1的卷積,然后才逐此開始添加。這導致與上述4608(16x32x3x3)個參數相反的656(16x3x3 + 16x32x1x1)個參數。
下面再進行詳細說明。
前面部分所提到的 2D 卷積核 1x1 卷積。讓我們先快速過一下標准的 2D 卷積。舉一個具體的案例,假設輸入層的大小為 7 x 7 x 3(高 x 寬 x 通道),過濾器大小為 3 x 3 x 3,經過一個過濾器的 2D 卷積后,輸出層的大小為 5 x 5 x 1(僅有 1 個通道)。如下圖所示:
圖5. 使用1個過濾器做標准的2D卷積來創建一層的輸出
一般來說,兩個神經網絡層間應用了多個過濾器,現在假設過濾器個數為 128。128 次 2D 卷積得到了 128 個 5 x 5 x 1 的輸出映射。然后將這些映射堆疊為一個大小為 5 x 5 x 128 的單個層。空間維度如高和寬縮小了,而深度則擴大了。如下圖所示
圖6. 使用128個過濾器做標准的2D卷積來創建一個128層的輸出