深度學習的卷積算法指南[2] 卷積詳解

導言算法

本文詳細介紹了卷積神經網絡(CNN)中的卷積算法,包括 零填充(zero padding)和單位步長(unit-stride)等參數在不一樣設置下計算推導。網絡

CVeride

做者:Vincent Dumoulin & Francesco Visin 函數

編輯: Amusi 學習

校稿: Amusiui

前戲翻譯

上篇整理了深度學習的卷積算法指南[1] 卷積和池化簡介,其介紹了《A guide to convolution arithmetic for deep learning》原論文中的第一章 Introduction內容。本文爲「深度學習的卷積算法指南[2] 卷積詳解」,重點介紹原論文中第二章 Convolution arithmetric 內容。3d

部分名詞翻譯blog

discrete convolution:離散卷積ip

kernel:核

pooling:池化

padding:填充

zero-padding:以零填充

stride:步長

feature map:特徵圖

input feature map:輸入特徵圖

output feature map:輸出特徵圖

subsampling:子採樣

translated:平移

average pooling:平均池化

max pooling:最大池化

unit-stride:單位步長

non-unit stride:非單位步長

2 Convolution arithmetric

The analysis of the relationship between convolutional layer properties is eased by the fact that they don’t interact across axes, i.e., the choice of kernel size, stride and zero padding along axis j only affects the output size of axis j.本章將重點介紹如下簡化的設置:

二維(2-D)離散卷積(N=2)

方形(square)輸入(i1=i2=i)

方形卷積核(k1=k2=k)

沿着每條軸相同的步長(s1=s2=s)

沿着每條軸相同的zero padding(p1=p2=p)

這有助於分析和可視化(visualization),但請記住,這裏概述的結果也推廣到N-D和非方形的狀況。

注:上述默認採用方形(square),一方面便於計算,一方面是在大量實驗驗證下獲得的結論。

2.1 No zero padding,unit strides

分析最簡單的狀況是 kernel 在輸入上的每一個位置滑動(即s = 1和p = 0)。圖2.1 提供了一個i = 4和k = 3的例子。

在這種狀況下定義輸出大小的一種方法是經過 kernel 在輸入上可能的位置(placement)數量。(即有多少種位置,輸出特徵圖就有多少個輸出元素)。讓咱們考慮寬度軸(width axis):kernel 從輸入特徵圖的最左側開始,並以步長1滑動,直到它觸及輸入的最右側。 輸出的大小等於所執行的步數,再加上1,由於要算上kernel 的初始位置(圖2.8a)。一樣的邏輯適用於高度軸(height axis)。

更規範地說,能夠推斷出如下關係:

關係1:對於任意 i 和 k,s = 1 且 p = 0時,有 o = (i - k) + 1

深度學習的卷積算法指南[2] 卷積詳解

圖2.1:(無填充,單位步長)利用單位步長在4×4的輸入上使用包含 3×3 的卷積核(convolutional kernel)(即i = 4,k = 3,s = 1和p = 0)。

2.2 Zero padding,unit strides

爲了考慮零填充(即僅限於s = 1),讓咱們考慮它對有效輸入大小的影響:用 p個zero padding將有效輸入大小從 i 改變爲 i + 2p。在通常狀況下,可使用關係1來推斷如下關係:

關係2:對於任意 i,k,p和 s = 1時,o = (i - k) + 2p + 1

圖2.2 介紹了 i = 5,k = 4,p = 2的示例。

實際上,因爲它們各自的屬性,兩個具體的zero padding被普遍使用。下面讓咱們更加詳細地討論它們。

深度學習的卷積算法指南[2] 卷積詳解

圖2.2:(Arbitrary padding,unit strides)利用單位步長在包含 2×2 零邊界的5×5的輸入上使用4×4的卷積核(即i = 5,k = 4,s = 1和p = 2)。

2.2.1 Half(same)padding

使輸出大小與輸入大小相同(即,o = i)是理想的屬性:

關係3:對於任意 i 和 奇數k(k=2n+1,n屬於N),s = 1,p = [k/2] = n([]表示向下取整), o = i+p[k/2] - (k-1) = i+2n-2n = i。

這有時被稱爲一半half(或相同)的填充。圖2.3提供了一個i = 5,k = 3和(所以)p = 1的例子。

深度學習的卷積算法指南[2] 卷積詳解

圖2.3:(Half padding,unit strides)利用半填充和單位步長在 5×5的輸入上使用3×3的卷積核(即i = 5,k = 3,s = 1和p = 1)。

2.2.2 Full padding

雖然卷積kernel 一般會減少輸出大小(相比於輸入大小),但有時須要相反。這能夠經過適當的 zero paddings 來實現:

關係4:對於任意i 和k,p = k-1和 s = 1,o = i+2p -k + 1 = i+2(k-1) - (k-1) = i + (k-1)。

這有時被稱爲全填充(full padding),由於在此設置中,每一個可能的部分或完整的kernel在輸入特徵圖上的疊加(superimposition)都被考慮在內。圖2.4 爲i = 5,k = 3和(所以)p = 2提供了一個示例。

深度學習的卷積算法指南[2] 卷積詳解

圖2.4:(Full padding,unit strides)利用全填充和單位步長在 5×5的輸入上使用3×3的卷積核(即i = 5,k = 3,s = 1和p = 2)。

2.3 No zero padding,non-unit strides

到目前爲止,推導的(derived)全部關係僅適用於單位步長(unit-strided)卷積。在考慮非單位步長(non unitary strides)時中須要另外一個推導過程。爲了便於分析,咱們暫時忽略 zero padding(即s > 1和p = 0)。圖2.5 提供了一個 i = 5,k = 3和s = 2的例子。

一樣的,輸出大小能夠根據kernel 在輸入上可能的位置數量來定義。讓咱們考慮寬度軸:kernel在輸入的最左邊部分像往常同樣開始,可是此次它按步長s滑動,直到它接觸輸入的最右側。輸出的大小再次等於所執行的步數,再加上1,由於還要包括 kernel的初始位置(圖2.8b)。一樣的邏輯適用於高度軸。

由此可推斷出如下關係:

關係5:對於任意i,k,s和 p=0,o = [(i - k) / s] + 1([]表示向下取整)

深度學習的卷積算法指南[2] 卷積詳解

Floor 函數(其功能是向下取整)說明了這樣一個事實,即有時最後一個可能的步驟(step)與 kernel 到達輸入末尾不一致,即某些輸入單位被省略(參見圖2.7中這種狀況的一個例子)。

深度學習的卷積算法指南[2] 卷積詳解

圖2.5:(No zero padding,arbitrary strides)利用2x2 步長在 5×5的輸入上使用3×3的卷積核(即i = 5,k = 3,s = 2和p = 0)。

2.4 Zero padding,non-unit strides

最多見的狀況(使用非單位步長(non-unit strides)對零填充(zerp padded)輸入進行卷積)能夠經過將關係5應用於大小爲i + 2p的有效輸入來推導出,相似於關係2所作的:

關係6(最通用的關係):對於任意 i,k,p和s,o = [(i +2p - k) / s] + 1。

深度學習的卷積算法指南[2] 卷積詳解
如前所述,floor 函數意味着在某些狀況下,卷積將爲多個輸入尺寸生成相同的輸出尺寸。更具體地說,若是i + 2p-k是 s的倍數,那麼任何輸入大小 j = i + a,a屬於{0,...,s-1} 將產生相同的輸出尺寸。請注意,這種狀況僅適用於s > 1。

圖2.6 顯示了一個i = 5,k = 3,s = 2和p = 1的示例,而圖2.7提供了i = 6,k = 3,s = 2和p = 1的示例。有趣的是, 儘管具備不一樣的輸入大小,但這些卷積共享相同的輸出大小。雖然這不影響對卷積(convolution)的分析,但這會使反/轉置卷積(transposed convolutions)的分析複雜化。

深度學習的卷積算法指南[2] 卷積詳解

圖2.6:(Arbitrary padding 和 strides)利用2x2 步長在具備1x1 padding的5×5的輸入上使用3×3的卷積核(即i = 5,k = 3,s = 2和p = 1)。

深度學習的卷積算法指南[2] 卷積詳解

圖2.7:(Arbitrary padding 和 strides)利用2x2 步長在具備1x1 padding的6×6的輸入上使用3×3的卷積核(即i = 6,k = 3,s = 2和p = 1)。在這種狀況下,由零填充輸入的底行(bottom row)和右列(right column)不被 kernel覆蓋。

深度學習的卷積算法指南[2] 卷積詳解

(a)步長(stride)爲1的狀況:kernel 必須向右滑動 2步才能到達輸入的最右側(等效向下)。還要加1,由於有初始位置,因此輸出尺寸爲(2+1)x(2+1),即3×3。

深度學習的卷積算法指南[2] 卷積詳解

(b)步長(stride)爲2的狀況:kernel 必須向右滑動 1步才能到達輸入的最右側(等效向下)。還要加1,由於有初始位置,因此輸出尺寸爲(1+1)x(1+1),即2×2。

圖2.8:計算 kernel位置數量。

相關文章
相關標籤/搜索