卷积神经网络中不同类型的卷积方式介绍
之前在文章《<模型匯總_1>牛逼的深度卷積神經網絡CNN》詳細介紹了卷積神經網絡的基本原理,以及常見的基本模型,如LeNet,VGGNet,AlexNet,ReseNet,Inception Net的基本結構和原理。今天主要總結一下,卷積神經網絡家族中,不同類型的卷積方式以及它們各自的優點。為了簡單起見,我們僅從2維的角度介紹。
文末提供相關資料下載地址
卷積基本概念
首先,我們首先回顧一下卷積相關的基本概念,定義一個卷積層需要的幾個參數。
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架構,但仍然非常有用。通過這種方式,我們可以通過一個卷積來放大一張圖片,而不需要進行兩個單獨的操作。
作者:Arthurcsh
鏈接:http://www.jianshu.com/p/77302843e1e6
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。 與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的卷积神经网络中不同类型的卷积方式介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow 使用例子-LSTM
- 下一篇: 反卷积在神经网络可视化上的成功应用