一文帶你瞭解深度學習中的各種卷積(下)

極驗發表於2019-02-28

如果你聽過深度學習中不同的卷積型別,包括:

2D/3D/1*1/Ttransposed/Dilated/Spatially

Separable/Depthwise Separable/Flattened/Grouped/Shuffled Grouped Convolution 

這些,但是並不清楚它們實際意味著什麼,本文就是帶大家學習這些卷積到底是如何工作的。

在本文中,我儘量使用簡單明瞭的方式向大家解釋深度學習中常用的幾種卷積,希望能夠幫助你建立學習體系,併為你的研究提供參考。

Transposed Convolution

在許多應用和網路架構中,我們經常想要做逆向的卷積,即要進行上取樣。一些示例包括了影象高解析度,需要將低維特徵對映到高維空間,比如自動編碼器或者語義分割。(對於語義分割,首先用編碼器提取特徵圖,然後在解碼器中恢復原始影象大小,這樣來實現分類原始影象的每個畫素。)

更直接的,可以通過應用插值方案或手動建立規則來實現上取樣。現在的一些結構,像神經網路,傾向於讓網路自己學習正確的轉換。要實現這一點,我們可以使用Transposed Convolution。

轉置卷積(Transposed Convolution)在文獻中也稱為deconvolution或者fractionally strided convolution。

但是“deconvolution”這個名字不太合適,因為Transposed Convolution畢竟不是訊號/影象處理中定義的那種反摺積。從技術上講,在訊號/影象處理中deconvolution是反向的卷積操作。我們這裡講的不是這種情況。因為這,很多學者很反對將Transposed Convolution叫做deconvolution。下面我們會講解,為什麼將這種卷積操作叫做“Transposed Convolution”會更合適。

我們可以使用直接卷積實現轉置卷積。看下面圖片中的例子,輸入是2 x 2,填充2 x 2的0邊緣,3 x 3的卷積核,stride=1。上取樣輸出大小是4 x 4。

一文帶你瞭解深度學習中的各種卷積(下)

很有趣,通過填充和步長的調整,我們可以把同一張2 x 2的影象對映成不同大小的輸出。下面,轉置卷積應用在相同的2 x 2輸入(在輸入之間插入一個0)填充2 x 2邊緣,stride=1。現在,輸出大小為5 x 5。

通過上面的例子瞭解轉置卷積,可以幫我們建立直觀的印象。但是要具體瞭解如何應用,就要看看在計算機中矩陣乘法是如何計算的。這樣我們也可以看出,為什麼Transposed Convolution是更好的名字。

在卷積中,讓我們定義C作為我們的卷積核,Large是輸入影象,Small是卷積輸出影象。完成卷積(矩陣乘法)後,我們下采樣large影象,得到小的輸出影象。卷積中的矩陣乘法滿足C x Large=Small。

下面的例子展示了該操作是怎麼工作的。首先將輸入變成一個16 x 1的矩陣,然後將Kernel轉換成4 x 16的稀疏矩陣。在稀疏矩陣和變換後的輸入間執行矩陣乘法。完成後,將得到的結果矩陣(4 x 1)轉換回2 x 2輸出。

一文帶你瞭解深度學習中的各種卷積(下)

現在,如果我們在等式兩邊多次執行矩陣C轉置,得到轉置矩陣CT,使用矩陣與其轉置矩陣的乘法給出單位矩陣的屬性,得到如下的公式CT x Large=Small如下圖:

一文帶你瞭解深度學習中的各種卷積(下)

如你所見,我們執行了小影象到大影象的下采樣。這也是我們想要得到的。現在你也明白“Transposed Convolution”的由來。

Dilated Convolution

這是標準的離散卷積:

一文帶你瞭解深度學習中的各種卷積(下)
一文帶你瞭解深度學習中的各種卷積(下)

機器人廚師本尊

dilated convolution如下:

一文帶你瞭解深度學習中的各種卷積(下)

l=1,dilated convolution稱為標準離散卷積。

一文帶你瞭解深度學習中的各種卷積(下)

直觀地說,dilated convolutions通過在卷積核元素之間插入空格來“擴張”卷積核。擴充的引數取決於我們想如何擴大卷積核。具體實現可能會不同,但核心元素之間通常會插入l-1個空格。下面的圖展示了,當kernel大小為l=1,2,4的時候。

一文帶你瞭解深度學習中的各種卷積(下)

dilated convolutions的感受野,在沒有增加消耗的情況下,能夠觀察到更大的感受野。

在圖中,3 x 3的紅點表明,卷積後,輸出影象是3x3畫素。雖然三個卷積提供的輸出具有相同的大小,但是模型的感受野卻是不同的。當l=1時,感受野是3 x 3;l=2時,感受野是7 x7;當l=3時,感受野擴張到15 x 15。有趣的是,這些操作的相關引數數量基本相同。因此,dilated convolution被用來擴大輸出的感受野,而不增加kernel的尺寸,當多個dilated convolution一個接一個堆疊時,這特別有效。

Separable Convolution

Separable Convolution會在一些神經網路結構中用到,比如MobileNet。有Spatially Separable Convolution 和depthwise Separable Convolution之分。

Spatially Separable Convolution

Spatially Separable Convolution在影象的2D空間維度上操作,比如高度和寬度。從概念上說,可以將該卷積操作分為兩步。我們可以看下面的例子,一個Sobel kernel,3 x 3尺寸,分為3 x 1和 1 x 3的兩個kernel。

一文帶你瞭解深度學習中的各種卷積(下)

一般卷積中,是3 x 3 kernel直接和影象卷積。而Spatially Separable Convolution中,首先是3 x 1的卷積核和影象卷積, 然後再是1 x 3卷積核操作。這樣一來,只需要6個引數就可以搞定了,而相同的一般卷積操作需要9個引數

更多的,在Spatially Separable Convolution中,矩陣乘法也更少。

我們一起來看一個具體的例子,一個5 x 5的影象,3 x 3的卷積核(stride=1,padding=0),需要水平掃描三次,垂直掃描三次。有9個位置,可以看下圖。在每個位置,9個元素要進行乘法。所以總共是要執行9 x 9=81次乘法。

一文帶你瞭解深度學習中的各種卷積(下)

我們可以來看看Spatially Separable Convolution中是怎麼樣的。我們首先應用3 x 1的filter在5 x 5影象上。那麼應該是水平掃描5個位置,垂直掃描3個位置。那麼總共應該是5 x 3=15個位置,如下方有黃點的圖所示。在每個位置,完成3次乘法,總共是15 x 3=45次乘法。現在我們得到的是一個3 x 5的矩陣。然後再在3 x 5矩陣上應用1 x 3kernel,那麼需要水平掃描3個位置和垂直掃描3個位置。總共9個位置,每個位置執行3次乘法,那麼是9 x 3=27次,所以完成一次Spatially Separable Convolution總共是執行了45+27=72次乘法,這比一般卷積要少。

一文帶你瞭解深度學習中的各種卷積(下)

讓我們歸納一下上面的例子。現在,我們應用卷積在一個N x N的影象上,kernel尺寸為m x m,stride=1,padding=0。傳統卷積需要(N-2) x (N-2) x m+(N-2)x(N-2)xm=(2N-2)x(N-2)xm次乘法。

標準卷積和Spatially Separable Convolution的計算成本比為:

一文帶你瞭解深度學習中的各種卷積(下)

當有的層,影象的尺寸N遠遠大於過濾器的尺寸m(N>>m)時,上面的等式就可以簡化為2/m。這意味著,在該種情況下,如果kernel大小為3 x 3,那麼Spatially Separable Convolution的計算成本是傳統卷積的2/3。

雖然Spatially Separable Convolution可以節省成本,但是它卻很少在深度學習中使用。最主要的原因是,不是所有的kernel都可以被分為兩個更小的kernel的。如果我們將所有傳統卷積用Spatially Separable Convolution替代,那麼這將限制在訓練過程中找到所有可能的kernels。找到的結果也許就不是最優的。

Depthwise  Separable Convolution

現在讓我們再來看看Depthwise  Separable Convolution,這在深度學習中就應用得更多一些了。該卷積也是分兩步,DW卷積和1 x 1卷積。

在講解這步驟之前,我們有必要回顧一下上面提到的2D卷積和1 x 1卷積。讓我們快速過一下標準2D卷積。直接看具體的案例,輸入的大小是7 x 7 x 3(高、寬、通道數)。卷積核大小3 x 3 x 3。完成2D卷積操作之後,輸出是5 x 5 x 1(只有一個通道)。

一文帶你瞭解深度學習中的各種卷積(下)

一般的,兩個網路層之間會有多個過濾器。這裡我們有128個過濾器。在應用128個2D卷積後,我們有128個5 x 5 x 1的輸出特徵圖。我們然後將這些特徵圖堆疊到單層,大小為5 x 5 x 128。通過該操作,我們將輸入(7 x 7 x 3)的轉換成了5 x 5 x 128的輸出。在空間上,高度和寬度都壓縮了,但是深度擴充了。

一文帶你瞭解深度學習中的各種卷積(下)

128個filter,將輸出擴充套件到128層

現在我們看看使用depthwise separable convolution ,讓我們看看如何獲得相同的轉換效果。

首先,我們將deothwise convolution應用到輸入層。和使用單一3 x 3 x 3filter在2D卷積上不同,我們使用3個分開的kernel。每個kernel的尺寸是3 x 3 x 1。每個kernel只完成輸入的單通道卷積。每個這樣的卷積操作會得到一個5 x 5 x 1的特徵圖。然後,我們將三個特徵圖堆疊到一起,得到一個5 x 5 x 3的影象。操作結束,輸出的大小為5 x 5 x 3。我們壓縮了空間維度,但是輸出的深度和輸入是一樣的。

一文帶你瞭解深度學習中的各種卷積(下)

depthwise separable convolution的第二步是,擴充深度,我們使用大小為1 x 1 x 3的kernel,完成1 x 1卷積。最後得到5 x 5 x 1的特徵圖。

一文帶你瞭解深度學習中的各種卷積(下)

在完成128個1 x 1卷積操作之後,我們得到了5 x 5 x 128的層。

一文帶你瞭解深度學習中的各種卷積(下)

通過上面的兩步,deothwise separable convolution將輸入(7 x 7 x 3)的轉換成了5 x 5 x 128的輸出。

整個過程如下圖:

一文帶你瞭解深度學習中的各種卷積(下)

因此,deothwise separable convolution的優勢是什麼呢?效率!比起2D卷積,deothwise separable convolution要少很多操作。

讓我們來看看2D卷積的計算消耗。有128個3 x 3 x 3卷積核,移動5 x 5次。一共要執行128 x 3 x 3 x 3 x 5 x 5=86400乘法。

separable convolution呢?在第一步deothwise convolution中,這裡有3個3 x 3 x 1kernel,移動5 x 5次,一共是675次乘法。在第二步中,128個1 x 1 x 3卷積核移動5 x 5次,一共9600次乘法。總的計算消耗是675+9600=10275次乘法。消耗僅僅只有2D卷積的12%。

因此,隨意一張圖的處理,應用deothwise separable convolution可以節省多少時間呢?讓我們根據上面的案例做一般推導。現在,假設輸入是H x W x D,2D卷積(stride=1,padding=0)Nc個kernel大小為h x h x D,其中h是偶數。將輸入H x W x D轉換為輸出層(H-h+1 x W-h+1 x Nc。總的乘法操作是:Nc x h x h x D x (H-h+1) x (W-h+1)。

另一方面,使用depthwise separable convolution的計算消耗是:

一文帶你瞭解深度學習中的各種卷積(下)

後者和前者的計算消耗比例為:

一文帶你瞭解深度學習中的各種卷積(下)

在現在的很多結構中,輸出層都有相當多的通道。也就是說Nc往往遠大於h。所以,如果是3 x 3的filter,那麼2D卷積花的時間是depthwise separable convolution的9倍,如果是5 x 5的卷積核,將是25倍。

depthwise separable convolution的劣勢是什麼呢?它減少了卷積的引數。如果是一個較小的模型,那麼模型的空間將顯著減小。這造成的結果就是,模型得到的結果並不是最優。

原文連結:

https://towardsdatascience.com/a-comprehensive-introduction-to-different-types-of-convolutions-in-deep-learning-669281e58215

相關文章