如果你聽過深度學習中不同的卷積型別,包括:
2D/3D/1*1/Ttransposed/Dilated/Spatially
Separable/Depthwise Separable/Flattened/Grouped/Shuffled Grouped Convolution
這些,但是並不清楚它們實際意味著什麼,本文就是帶大家學習這些卷積到底是如何工作的。
在本文中,我儘量使用簡單明瞭的方式向大家解釋深度學習中常用的幾種卷積,希望能夠幫助你建立學習體系,併為你的研究提供參考。
Convolution VS Cross-correlation
卷積是一項在訊號處理、視覺處理或者其他工程/科學領域中應用廣泛的技術。在深度學習中,有一種模型架構,叫做Convolution Neural Network。深度學習中的卷積本質上就是訊號處理中的Cross-correlation。當然,兩者之間也存在細微的差別。
在訊號/影象處理中,卷積定義如下:
由上公式可以看出,卷積是通過兩個函式f和g生成第三個函式的一種數學運算元。對f與經過翻轉和平移的g乘積進行積分。過程如下:
訊號處理中的卷積。濾波器g首先翻轉,然後沿著橫座標移動。計算兩者相交的面積,就是卷積值。
另一方面,Cross-correlation被稱為滑動點積或者兩個函式的滑動內積。Cross-correlation中的濾波器函式是不用翻轉的。它直接劃過特徵函式f。f和g相交的區域就是Cross-correlation。
在深度學習中,卷積中的濾波器不翻轉。嚴格來說,它是Cross-correlation。我們基本上執行元素對元素的加法或者乘法。但是,在深度學習中,我們還是習慣叫做Convolution。濾波器的權重是在訓練期間學習的。
Convolution in Deep Learning
卷積的目的是為了從輸入中提取有用的特徵。在影象處理中,有很多濾波器可以供我們選擇。每一種濾波器幫助我們提取不同的特徵。比如水平/垂直/對角線邊緣等等。在CNN中,通過卷積提取不同的特徵,濾波器的權重在訓練期間自動學習。然後將所有提取到的特徵“組合”以作出決定。
卷積的優勢在於,權重共享和平移不變性。同時還考慮到了畫素空間的關係,而這一點很有用,特別是在計算機視覺任務中,因為這些任務通常涉及識別具有空間關係的物件。(例如:狗的身體通常連線頭部、四肢和尾部)。
The single channel version
The muti-channel version
在很多應用中,我們需要處理多通道圖片。最典型的例子就是RGB影象。
在描述這個過程之前,我們先介紹一些術語:layers(層)、channels(通道)、feature maps(特徵圖),filters(濾波器),kernels(卷積核)。從層次結構的角度來看,層和濾波器的概念處於同一水平,而通道和卷積核在下一級結構中。通道和特徵圖是同一個事情。一層可以有多個通道(或者說特徵圖)。如果輸入的是一個RGB影象,那麼就會有3個通道。“channel”通常被用來描述“layer”的結構。相似的,“kernel”是被用來描述“filter”的結構。
講了概念,下面我們繼續講解多通道卷積。將每個核心應用到前一層的輸入通道上以生成一個輸出通道。這是一個卷積核過程,我們為所有Kernel重複這樣的過程以生成多個通道。然後把這些通道加在一起形成單個輸出通道。下圖:
輸入是一個5x5x3的矩陣,有三個通道。filter是一個3x3x3的矩陣。首先,filter中的每個卷積核分別應用於輸入層中的三個通道。執行三次卷積,產生3個3x3的通道。
然後,這三個通道相加(矩陣加法),得到一個3x3x1的單通道。這個通道就是在輸入層(5x5x3矩陣)應用filter(3x3x3矩陣)的結果。
同樣的,我們可以把這個過程看作是一個3Dfilter矩陣滑過輸入層。值得注意的是,輸入層和filter有相同的深度(通道數量=卷積核數量)。3Dfilter只需要在2維方向上移動,影象的高和寬。這也是為什麼這種操作被稱為2D卷積,儘管是使用的3D濾波器來處理3D資料。在每一個滑動位置,我們執行卷積,得到一個數字。就像下面的例子中體現的,滑動水平的5個位置和垂直的5個位置進行。總之,我們得到了一個單一通道輸出。
現在,我們一起來看看,如何在不同深度的層之間轉換。假設輸入層有xin個通道,我們想得到輸出有Dout個通道。我們只需要將Dout filters應用到輸入層。每一個 filter有Din個卷積核。每個filter提供一個輸出通道。完成該過程,將結果堆疊在一起形成輸出層。
在上一節的最後一個插圖中,可以看出,這實際上是在完成3D卷積。但是在深度學習中,我們仍然把上述操作稱為2D卷積。3D資料,2D卷積。濾波器的深度和輸入層的深度是一樣的。3D濾波器只在兩個方向上移動(影象的高和寬),而輸出也是一個2D的影象(僅有一個通道)。
3D卷積是存在的,它們是2D卷積的推廣。在3D卷積中,濾波器的深度小於輸入層的深度(也可以說卷積核尺寸小於通道尺寸)。所以,3D濾波器需要在資料的三個維度上移動(影象的長、寬、高)。在濾波器移動的每個位置,執行一次卷積,得到一個數字。當濾波器滑過整個3D空間,輸出的結果也是一個3D的。
和2D卷積能夠編碼2D域中的物件關係一樣,3D卷積也可以描述3D空間中的物件關係。3D關係在一些應用中是很重要的,比如3D分割/醫學影象重構等。
1x1 Convolution
下面我們來看一種有趣的操作,1x1卷積。
我們會有疑問,這種卷積操作真的有用嗎?看起來只是一個數字乘以輸入層的每個數字?正確,也不正確。如果輸入資料只有一個通道,那這種操作就是將每個元素乘上一個數字。
但是,如果輸入資料是多通道的。那麼下面的圖可以說明,1 x 1卷積是如何工作的。輸入的資料是尺寸是H x W x D,濾波器尺寸是1 x 1x D,輸出通道尺寸是H x W x 1。如果我們執行N次1x1卷積,並將結果連線在一起,那可以得到一個H x W x N的輸出。
1 x 1卷積在論文《Network In Network》中提出來。並且在Google發表的《Going Deeper with Convolution》中也有用到。1 x 1卷積的優勢如下:
降低維度以實現高效計算
高效的低維嵌入,或特徵池
卷積後再次應用非線性
前兩個優勢可以從上圖中看出。完成1 x 1卷積操作後,顯著的降低了depth-wise的維度。如果原始輸入有200個通道,那麼1 x 1卷積操作將這些通道嵌入到單一通道。第三個優勢是指,在1 x 1卷積後,可以新增諸如ReLU等非線性啟用。非線性允許網路學習更加複雜的函式。
Convolution Arithmetic
現在我們知道了depth維度的卷積。我們繼續學習另外兩個方向(height&width),同樣重要的卷積演算法。一些術語:
Kernel size(卷積核尺寸):卷積核在上面的部分已有提到,卷積核大小定義了卷積的檢視。
Stride(步長):定義了卷積核在影象中移動的每一步的大小。比如Stride=1,那麼卷積核就是按一個畫素大小移動。Stride=2,那麼卷積核在影象中就是按2個畫素移動(即,會跳過一個畫素)。我們可以用stride>=2,來對影象進行下采樣。
Padding:可以將Padding理解為在影象外圍補充一些畫素點。padding可以保持空間輸出維度等於輸入影象,必要的話,可以在輸入外圍填充0。另一方面,unpadded卷積只對輸入影象的畫素執行卷積,沒有填充0。輸出的尺寸將小於輸入。
下圖是2D卷積,Kernel size=3,Stride=1,Padding=1:
這裡有一篇寫得很好的文章,推薦給大家。它講述了更多的細節和舉了很多例子來講述不同的Kernel size、stride和padding的組合。這裡我只是總結一般案例的結果。
輸入影象大小是i,kernel size=k,padding=p,stride=s,那麼卷積後的輸出o計算如下: