卷積的目的是為了從輸入中提取有用的特徵。在影象處理中,有很多濾波器可以供我們選擇。每一種濾波器幫助我們提取不同的特徵。比如水平/垂直/對角線邊緣等等。在cnn中,通過卷積提取不同的特徵,濾波器的權重在訓練期間自動學習。然後將所有提取到的特徵「組合」以作出決定。
卷積的優勢在於,權重共享和平移不變性。同時還考慮到了畫素空間的關係,而這一點很有用,特別是在計算機視覺任務中,因為這些任務通常涉及識別具有空間關係的物件。(例如:狗的身體通常連線頭部、四肢和尾部)。
單通道版本
單個通道的卷積
在深度學習中,卷積是元素對元素的加法和乘法。對於具有乙個通道的影象,卷積如上圖所示。這裡的濾波器是乙個3x3的矩陣[[0,1,2],[2,2,0],[0,1,2]]。濾波器滑過輸入,在每個位置完成一次卷積,每個滑動位置得到乙個數字。最終輸出仍然是乙個3x3的矩陣。(注意,在上面的例子中,stride=1, padding=0)
多通道版本
在很多應用中,我們需要處理多通道。最典型的例子就是rgb影象。
不同的通道強調原始影象的不同方面
另乙個多通道資料的例子是cnn中的層。卷積網路通常由多個通道組成(通常為數百個通道)。每個通道描述前一層的不同方面。我們如何在不同深度的層之間進行轉換?如何將深度為n的層轉換為深度為m的下一層?
在描述這個過程之前,我們先介紹一些術語:layers(層)、channels(通道)、feature maps (特徵圖)、filters(濾波器)、kernels(卷積核)。從層次結構來看,層和濾波器的概念處於同一水平,而通道和卷積核在下一級結構中。通道和特徵圖是同乙個事情。一層可以有多個通道(或者說特徵圖)。如果輸入的是乙個rgb影象,那麼就會有3個通道。「channel"通常被用來描述"layer"的結構。相似的,"kernel"是被用來描述」filter」的結構。
filter和kernel之間的不同很微妙。很多時候,它們可以互換,所以這可能造成我們的混淆。那它們之間的不同在於**呢?乙個"kernel"更傾向於是2d的權重矩陣。而'filter"則是指多個kernel堆疊的3d結構。如果是乙個2d的filter,那麼兩者就是一樣的。但是乙個3dfilter, 在大多數深度學習的卷積中,它是包含kernel的。每個卷積核都是獨一無二的,主要在於強調輸入通道的不同方面。
講了概念,下面我們繼續講解多通道卷積。將每個核心應用到前一層的輸入通道上以生成乙個輸出通道。這是乙個卷積核過程,我們為所有kernel重複這樣的過程生成多個通道。然後把這些通道加在一起形成單個輸出通道。下圖:
輸入是乙個5x5x3的矩陣,有三個通道。filter是乙個3x3x3的矩陣。首先,filter中的每個卷積核分別應用於輸入層的三個通道。執行三次卷積,產生3個3x3的通道。
然後,這三個通道相加(矩陣加法),得到乙個3x3x1的單通道。這個通道就是在輸入層(5x5x3矩陣)應用filter(3x3x3矩陣)的結構。
同樣的,我們可以把這個過程看作是乙個3dfilter矩陣滑過輸入層。值得注意的是,輸入層和filter有相同的深度(通道數量=卷積核數量)。3dfilter只需要在2維方向上移動,影象的高和寬。這也是為什麼這種操作被稱為2d卷積,儘管是使用3d濾波器來處理3d資料。在每乙個滑動位置,我們執行卷積,得到乙個數字。就像下面的例子中體現的,滑動水平的5個位置和垂直的5個位置進行。總之,我們得到了乙個單一通道輸出。
在上一節的最後乙個插圖中,可以看出,這實際上是在完成3d卷積。但是在深度學習中,我們仍然把上述操作稱為2d卷積。3d資料,2d卷積。濾波器的深度和輸入層的深度是一樣的。3d濾波器只在兩個方向上移動(影象的高和寬),而輸出也是乙個2d的影象(僅有乙個通道)。
3d卷積是存在的,它們是2d卷積的推廣。在3d卷積中,濾波器的深度要小於輸入層的深度(也可以說卷積尺寸小於通道尺寸)。所以,3d濾波器需要在資料的三個維度上移動(影象的長、寬、高)。在濾波器移動的每個位置,執行一次卷積,得到乙個數字。當濾波器滑過整個3d空間,輸出的結果也是乙個3d的。
和2d卷積能夠編碼2d域中的物件關係一樣,3d卷積也可以描述3d空間中的物件關係。3d關係在一些應用中是很重要的,比如3d分割/醫學影象重構等。
1x1 convolution
下面我們來看一看一種有趣的操作,1x1卷積。
我們會有疑問,這種卷積操作真的有用嗎?看起來只是乙個數字乘以輸入層的每個數字?正確,也不正確。如果輸入資料只有乙個通道,那這種操作就是將每個元素乘上乙個數字。
但是,如果輸入資料是多通道的。那麼下面的圖可以說明,1x1卷積是如何工作的。輸入的資料尺寸是hxwxd,濾波器尺寸是1x1xd,輸出通道尺寸是hxwx1。如果我們執行n次1x1卷積,並將結果連線在一起,那可以得到乙個h x w x n的輸出。
1x1卷積在**《network in network》中提出來。並且在google發表的《going deeper with convolution》中也有 用到。1x1卷積的優勢如下:
前兩個優勢可以從上圖中看出。完成1x1卷積操作後,顯著的降低了depth-wise的維度。如果原始輸入有200個通道,那麼1x1卷積操作將這些通道嵌入到單一通道。第三個優勢是指,在1x1卷積後,可以新增諸如relu等非線性啟用。非線性啟用允許網路學習更加複雜的函式。
convolution arithmeticj(卷積演算法)
現在我們知道了depth維度的卷積。我們繼續學習另外兩個方向(height&width), 同樣重要的卷積演算法。一些術語:
kernel size (卷積核尺寸):卷積核在上面的部分已有提到,卷積核大小定義了卷積的檢視。
stride(步長):定義了卷積核在影象中移動的每一步的大小。比如stride=1,那麼卷積核就是乙個按畫素大小移動。stride=2,那麼卷積核在影象中就是按2個畫素移動(即,會跳過乙個畫素)。我們可以用stride>=2,來對影象進行下取樣。
padding: 可以將padding理解為在影象外圍補充一些畫素點。padding可以保持空間輸出維度等於輸入影象,必要的話,可以在輸入外圍填充0。另一方面,unpadding卷積只對輸入影象的畫素進行卷積,沒有填充0.輸出的尺寸將小於輸入。
下圖是2d卷積, kernel size=3, stride=1, padding=1:
opencv學習筆記 卷積和核
高度概括地說,卷積是在每乙個影象塊與某個運算元 核 之間進行的運算。核說白了就是乙個固定大小的數值陣列。該陣列帶有乙個 錨點 一般位於陣列 假如你想得到影象的某個特定位置的卷積值,可用下列方法計算 將核的錨點放在該特定位置的畫素上,同時,核內的其他值與該畫素鄰域的各畫素重合 將核內各值與相應畫素值相...
深度學習中的卷積型別
使用卷積操作的動機是讓網路關注有意義的區域性特徵,同時因為其引數共享的機制,能夠極大地降低參數量,提高計算效率。深度學習發展至今,衍生出了多種卷積型別。除了常規卷積外,還有轉置卷積 空洞卷積 可分離卷積等。以2d卷積為例,乙個卷積操作通常包含以下幾個引數 卷積核尺寸 kernel size 卷積核的...
深度學習基礎 卷積 加速的卷積運算
convolution在gpu上如何實現,文中介紹了三種方法 缺點 這種實現呢需要處理許多的corner case。文中介紹cuda convnet2是實現了該種方法,該種方法在不同取值的卷積引數空間效率不一,比如batch size 128,效率很高,但是如果batch size 64,效率比較低...