論文閱讀筆記:Xception: Deep Learning with Depthwise Separable Convolutions
論文下載地址:Xception: DeepLearning with Depthwise Separable Convolutions
本文主要包含如下內容:
核心思想
這篇文章主要在 Inception V3 的基礎上提出了 Xception(Extreme Inception),基本思想就是設計了通道分離式卷積 depthwise separable convolution operation
網絡結構
我們可以將上面網絡看作,把整個輸入做1*1卷積,然後切成三段,分別3*3卷積後相連,如下圖,兩種形式是等價的:
現在我們想,如果不是分成三段,而是分成 5 段或者更多,那模型的表達能力是不是更強呢?於是我們就切更多段,切到不能再切了,正好是 Output channels 的數量(極限版本):
於是,就有了深度卷積 depthwise convolution。文章中將 depthwise separable convolution 分成兩步,一步叫depthwise convolution,另一步是 pointwise convolution。深度卷積是對輸入的每一個 channel 獨立的用對應 channel 的卷積核去卷積,假設卷積核的 shape 是 [filter_height, filter_width, in_channels, channel_multiplier],那麼每個 in_channel 會輸出 channel_multiplier 那麼多個通道,最後的 feature map 就會有 in_channels * channel_multiplier 個通道了。原文在深度卷積後面又加了 pointwise convolution,這個 pointwise convolution 就是 1*1 的卷積,可以看做是對那麼多分離的通道做了個融合。
Xception 結構由36個卷積層組成網絡的特徵提取基礎。我們的評估實驗中只進行圖像分類,因此我們在卷積之後使用了邏輯迴歸層。可選的,也可以在邏輯迴歸層之前加入完全連接層。36個卷積層被分成14個模塊,除最後一個外,模塊間有線性殘差連接。
實驗結果
精度較Inception V3有提高,ImageNET上的精度如下:
Table2表示幾種網絡結構在JFT數據集上的對比。大數據上的提升會比Table1好一點。:
tensorflow實現
#tensorflow 1.2.0 python 2.7
tf.nn.depthwise_conv2d(input,filter,strides,padding,rate=None,name=None,data_format=None)
#結果返回一個Tensor,shape爲[batch, out_height, out_width, in_channels * channel_multiplier],注意這裏輸出通道變成了in_channels * channel_multiplier
- name:指定操作的名字
- data_format:指定數據格式
- input:指需要做卷積的輸入圖像,要求是一個4維Tensor,具有[batch, height, width, in_channels]這樣的shape,具體含義是[訓練時batch的圖片數量, 圖片高度, 圖片寬度, 圖像通道數]
- filter:相當於CNN中的卷積核,要求是一個4維Tensor,具有[filter_height, filter_width, in_channels, channel_multiplier]這樣的shape,具體含義是[卷積核的高度,卷積核的寬度,輸入通道數,輸出卷積乘子],這裏第三維in_channels,就是參數input的第四維
- strides:卷積的滑動步長。
- padding:string類型的量,只能是”SAME”,”VALID”其中之一,這個值決定了不同邊緣填充方式。
- rate:rate=1時,此時這個函數就變成了普通卷積,並非空洞卷積。
空洞卷積atrous convolutions
又名擴張卷積dilated convolutions
,向卷積層引入了一個稱爲 “擴張率dilation rate
”的新參數,該參數定義了卷積核處理數據時各值的間距。