卷積神經網絡中不同類型的卷積方式介紹

卷積基本概念

    首先,我們首先回顧一下卷積相關的基本概念,定義一個卷積層需要的幾個參數。

                                                      2維卷積使用卷積核大小爲3,步長爲1和Padding

    卷積核大小(Kernel Size):卷積核大小定義了卷積的視野。2維中的常見選擇是3 - 即3x3像素矩陣。

    步長(Stride):步長定義遍歷圖像時卷積核的移動的步長。雖然它的默認值通常爲1,但我們可以使用值爲2的步長來對類似於MaxPooling的圖像進行下采樣。

    填充(Padding):填充定義如何處理樣本的邊界。Padding的目的是保持卷積操作的輸出尺寸等於輸入尺寸,因爲如果卷積核大於1,則不加Padding會導致卷積操作的輸出尺寸小於輸入尺寸。

    輸入和輸出通道(Channels):卷積層通常需要一定數量的輸入通道(I),並計算一定數量的輸出通道(O)。可以通過I * O * K來計算所需的參數,其中K等於卷積核中參數的數量,即卷積核大小。

    下面介紹幾種常見的卷積方式。

擴張卷積(Dilated Convolution)

(又稱Atrous Convolution)

                                                  2維卷積,卷積核大小爲3,擴張率(dilation rate)爲2,無Padding

    擴張卷積在進行卷積操作時引入了另一個參數,即擴張率,用以捕捉像素之間的long dependency。擴張率定義了卷積核中的值與值之間的間隔。擴張率爲2的3x3卷積核將具有與與5x5卷積核相同的視野,而只使用9個參數。想象一下,使用一個5x5卷積核並刪除第二行和列。

    這樣操作,使得在相同的計算成本下,卷積計算具有更寬的視野,可以捕捉更長的依賴關係。擴張卷積在實時圖像分割領域特別受歡迎。適用於需要更加寬泛的視野並且不用多個卷積或更大的卷積核情況。

    典型的網絡如WaveNet,論文下載地址:https://arxiv.org/abs/1609.03499

    Fully Convoluted Network,論文下載地址https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf

可變形(Deformable)卷積

    我們常見的卷積核(filter)一般都是呈長方形或正方形的,規則的卷積核往往會限制特徵抽取的有效性,更爲有效的做法是讓卷積和具有任意的形狀,那麼卷積核是否可以呈圓形或者隨意的形狀呢?答案是可行的,如下圖所示,典型的代表就是Deformable Convolution Network。

 對比上圖所示的a、b兩圖可以發現,任意形狀的的卷積核使得網絡可以重點關注一些重要的區域,更能有效且準確的抽取輸入圖像的特徵。

    怎麼樣來實現呢?

如上圖所示,網絡會根據原始的卷積,如圖a所示,學習一個offset偏量,通過一些列的旋轉、尺度變換、縮放等Transform變換,改變成成任意形狀的卷積核,如b、c、d圖所示。

Offet代表的Transform怎麼實現呢?

在deformable convolution中,會進行兩次卷積,第一次卷積計算得到offset的卷積核,第二次是利用第一步得到的offset卷積核進行常規的卷積得到最終輸出。重點是第一步中獲得offset卷積核。先從input feature map中通過卷積(conv)計算得到offset field,在基於offset field得到最終的offset。注意,offset得到的輸出通道數是input feature map的兩倍,因爲offset包含了在x和y兩個方向上的偏置項。

具體細節可以看考Deformable convolution Network的論文:https://arxiv.org/abs/1703.06211

深度可分離(Depth Separable)卷積

    在可分離的卷積中,我們可以將卷積核操作拆分成多個步驟。我們用y = conv(x,k)表示卷積,其中y是輸出圖像,x是輸入圖像,k是卷積核。接下來,假設k由公式:k = k1.dot(k2)計算。這就是一個可分離的卷積,因爲我們可以使用大小分別爲k1和k2兩個卷積核進行2個1D卷積來取得相同的結果,而不是用一個大小k進行二維卷積。

                                                                                  Sobel X和Y卷積核

    以Sobel卷積核爲例,通常用於圖像處理。我們可以通過向量[1,0,-1]乘以向量[1,2,1] 來獲得相同的卷積核。執行相同的操作,只需要6而不是9個參數。

    上面的例子就是所謂的空間可分離卷積,但在深度學習中並不是這樣做的。這樣介紹主要是舉個例子,不至於使人迷惑。在神經網絡中,通常使用稱爲深度可分離卷積的網絡,典型的網絡Xception Net,示意圖如下圖所示。

深度可分離卷積在執行空間卷積的同時,保持通道(Channels)之間分離,然後按照深度方向(depth)進行卷積。用一個例子來說明。

假設在16個輸入通道和32個輸出通道上,採用3x3卷積核進行卷積計算,16個通道上採用3x3卷積核,進行32次重複操作,產生512(16x32)個特徵圖(feature map)。然後,把這些特徵圖合併得到一個輸出通道。重複執行32次,最終得到了32個輸出通道。

對於同一個例子,採用深度可分離方式進行卷積,採用3x3卷積核分別遍歷16個通道,最終得到16個特徵圖。現在,在進行合併操作之前,先採用32個1x1卷積個來遍歷這16個特徵圖,然後再把它們合併到一起。採用可分離卷積,有656(16x3x3 + 16x32x1x1)參數,相反,傳統卷積操作有4608(16x32x3x3)參數,大大減少了參數的數目。

    該例子是一個典型的深度可分離卷積的例子,其中採用的深度乘數(Depth  Multiplier)爲1,也是一種最常見的設置。

這樣做是基於一個假設,即平面和深度方向信息可以解耦。Xception網絡證明了這個假設是有效的。因爲可以有效地使用模型的參數,所以深度可分離的卷積可以用於可移動設備上。

    典型的模型如Xception Net,細節可閱讀論文:https://arxiv.org/abs/1610.02357

Squeeze-and-Excitation Convolution

    Squeeze-and-Excitation 來源於ImageNet2017年的冠軍網絡SEnet。在傳統的LeNet、Inception、ReseNet、DenseNet中,我們認爲所有的特徵通道(Channel)都是同等重要的,那是否可以給每個通道賦予一個權重呢?SEnet就通過Squeeze-and-Excitation block來實現了這一想法,當然CNN的網絡結構十分靈活,還有很多其他簡單的實現方式,這裏就不一一列舉。Squeeze-and-Excitation block(簡稱SES 模塊)如下圖所示。

 以圖中爲例,輸入X具有C1數目的通道,經過一系列變換得到通道數爲C2的SES模塊的輸入。數據進入SES模塊分成兩路,如圖中,上面一路進行squeeze-excitation,Scale操作,下面一路進行傳統的卷積操作。在上面一路中,首先是Squeeze操作,沿着通道C2方向,採用Global Average pooling操作,把尺寸c2 X h X W的輸入pooling成一個c2 X 1 X 1的輸出,即把每一個二維的特徵圖轉換成一維的實數。Global Average pooling相當於一個全局的感受野,可以獲取h X W整張圖片信息,對應的標量輸出可以代表整張圖全局分佈。然後進行Excitation操作,借鑑RNN中的Gate機制,爲每一個通道賦予一個可訓練的權重W,通過W的學習,來建模通道間的重要性。最後是一個Sacle操作,通過Reweight操作把學習的到權重得到傳統的卷積得到的通道輸出上,得到通道的輸出特徵的重標定操作。

    這裏只是對SES原理簡單介紹,深入瞭解可以參考SEnet的論文:https://arxiv.org/abs/1709.01507

轉置(Transposed)卷積

(也稱爲deconvolutions 或 fractionally stride卷積)

    有些場景下使用deconvolution,這中說法其實不太合適,因爲它不是一個deconvolution,真正的deconvolution應該是卷積操作的逆過程。雖然deconvolution確實存在,但它們在深度學習領域並不常見。想象一下,將圖像輸入到單個卷積層。現在獲得輸出,把輸出扔到一個黑盒子裏,再恢復成的原始輸入圖像。這個黑盒子才叫做deconvolution。Deconvolution是卷積計算過程的逆計算過程。

    轉置卷積則比較貼切,因爲轉置會產生相同的空間分辨率。然而,真實執行的數學運算則稍有不同的。轉置卷積層一方面會執行常規卷積,同時也會恢復其空間變換。

2維卷積無填充,步長爲2和卷積核爲3

這一點可能會讓人覺得有點難以理解,所以我們來看一個具體的例子,如上圖。5x5的圖像被送入一個卷積層進行卷及計算。步長設置爲2,沒有填充,卷積核爲3x3。輸出爲一個2x2圖像。

    如果我們想反轉這個過程,我們需要進行數學逆運算,這樣每一個輸入的像素會產生9個輸出值。之後,我們以步長爲2的速度遍歷輸出圖像。這將是一個deconvolution操作,如下圖所示。

沒有填充的2維卷積,步長爲2和卷積核爲3

轉置卷積並不是這樣做的。與上述操作相比,唯一的共同之處在於,它保證輸出也將是5x5圖像,同時仍然執行正常的卷積運算。爲了實現這一點,我們需要在輸入圖像上進行一些漂亮的填充。

    你可以想象,這一步不會重複上面的過程。至少,數值上不會。它只是通過一個卷積操作來重構卷積操作的輸入。這並不是數學上的逆操作,只是一種Encoder-Decoder架構,但仍然非常有用。通過這種方式,我們可以通過一個卷積來放大一張圖片,而不需要進行兩個單獨的操作。

    下面這篇文章講得比較清楚:https://buptldy.github.io/2016/10/29/2016-10-29-deconv/

文中介紹的模型相關論文下載地址:

鏈接: https://pan.baidu.com/s/1qYA0R8K 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章