天天看點

【精讀AI論文】Xception ------(Xception: Deep Learning with Depthwise Separable Convolutions)

文章目錄

  • ​​前言:​​
  • ​​1.Abstract(摘要)​​
  • ​​2.Introduction(引言)​​
  • ​​2.1 初始假設​​
  • ​​2.2 進一步假設​​
  • ​​3.Prior work(前人工作介紹)​​
  • ​​4.The Xception architecture(Xception結構介紹)​​
  • ​​5.Experimental evaluation(實驗)​​
  • ​​總結​​

前言:

今天搞一下inception最後一個論文,Xception,該論文發表在CVPR2017。

看這篇論文之前建議看一下inception之前的幾個版本,以及ResNet論文。

  • ResNet 精讀+複現
  • inceptionV1 & GoogleNet 精讀+複現
  • inceptionV2 & BN 精讀
  • inceptionV3 精讀
  • InceptionV4 & Inception-ResNet 精讀

論文下載下傳位址​​:https://arxiv.org/pdf/1610.02357v3.pdf​​

論文題目:Xception: Deep Learning with Depthwise Separable Convolutions

Xception,這裡的X是 Extreme的縮寫,表示極緻的 inception。

1.Abstract(摘要)

摘要部分第作者說inception結構是傳統卷積和深度可分離卷積的中間形态。深度可分離卷積可以看作一個具有最大數量tower的Inception子產品,随後提出Xception的思想,即通過使用深度可分離卷積來代替Inception子產品産生的一個新網絡架構 命名為Xception。

傳統卷積:一個卷積核處理所有通道。

深度可分離卷積 :一個卷積核隻處理一個通道。

tower:指Inception子產品中各個path的數量

随後作者說了一下Xception的表現比inceptionV3 要好,且得到一個結論,兩個模型的參數量相近,但Xception的效果更好,說明Xception對資料的學習率,或者說效率提高了。側面反映Xception的模型結構更好,能在同樣參數量上獲得更好的效果。

2.Introduction(引言)

第一段慣例,介紹了一下當時的背景 CNN、LeNet到GoogleNet,inceptionV123還有Resnet等等,這些論文都在之前看過了,都在這個部落格裡,不過後面提到的兩個論文 一個NiN一個知識蒸餾還沒看,我倒是知道NiN提出了1 * 1卷積和全局平均池化代替全連接配接層的觀點,知識蒸餾倒是聽說過 不過還沒看過,等弄完這篇 去看一下NiN和知識蒸餾吧。

第二段誇了一下自己家的inception子產品,VGG是那種一條路走到黑的結構,就是一層卷積一層池化這樣堆疊深度,而inception子產品在寬度上進行了擴充,因為DL是玄學嘛,是以作者也是提出了自己的疑問,為啥inception能這麼有效果。

2.1 初始假設

這一小節嘗試解釋前面留下的問題,為什麼inception能有這麼好的效果。

在通常情況下,一個卷積核學習映射兩個方面,一個是通道次元,一個是空間次元(長度和寬度),這是3D的次元(長+寬+通道),而inception子產品背後的思路是,分開這兩個方面,達到一種‘解耦’的目的。

典型的inception子產品是 1 * 1 卷積來處理次元方面,然後用分解卷積處理空間資訊,就是5 * 5 分解成兩個3 * 3 那種情況。這一段最後有個腳标1,這裡是說,即使是在空間次元方面也是可以繼續分解的,比如7 * 7 分解成 7 * 1 和 1 * 7 ,這個思想是在inceptionV3裡面提出的不對稱卷積,忘了可以去回顧一下。

後面一大段放了幾張圖,其實就是在說這個‘解耦’的思想,先放了一張inceptionV3的圖,

【精讀AI論文】Xception ------(Xception: Deep Learning with Depthwise Separable Convolutions)

可以看到這張圖裡基本都用了1 * 1 卷積進行降維,在這裡可以說是在通道次元上進行處理。随後又處理了空間次元。

随後簡化了一下 變成了下面這樣:

【精讀AI論文】Xception ------(Xception: Deep Learning with Depthwise Separable Convolutions)

再次簡化:

【精讀AI論文】Xception ------(Xception: Deep Learning with Depthwise Separable Convolutions)

可以看到作者将所有的1 * 1 卷積合并到了一起,并且畫了一條隔閡一樣的東西,這裡的意思就是每個3 * 3 的卷積取這條隔閡裡的三分之一處理,且互不重合,假設1 * 1 之後生成了30個通道,則後面的3 * 3 卷積各處理其中的10個通道。

這裡又引出個問題,上面這個模型是 3 * 3 處理1 * 1中的三分之一,那到底每個處理其中的多少算是合适的?

2.2 進一步假設

這一節就是處理上個留下的問題,這裡作者直接提出了 ‘Extreme’版本的處理方法,在之前是 假設了1 * 1 之後有30個通道,分給了三個卷積,每個卷積分到10個通道,而這裡作者的 ‘Extreme’版本是 直接将這30個通道分給30個卷積去處理,即單獨的對每一個空間資訊做處理。(這算是全連接配接初始思想嗎?哈哈,玩輪回啊?)

然後作者給出了這個思想的結構圖:

【精讀AI論文】Xception ------(Xception: Deep Learning with Depthwise Separable Convolutions)

将1 * 1 處理過後的資料,每一個次元都分給一個3 * 3卷積去處理。

是以整體下來 ‘Extreme’ 版本 就是 1 * 1處理通道次元之間的資訊,3 * 3 卷積處理每一個通道次元内的空間次元資訊。

這個思想結構被稱為 ,深度可分離卷積 (depthwise separable convolution & separable convolution),這個分離卷積的‘分離’,就是分離在這裡了嘛。

  • depthwise convolution(空間次元的卷積,也就是長寬方向卷積)
  • pointwise convolution (通道次元的卷積)

depthwise separable convolution 和 spatially separable convolution别搞混了!:

  • 前者是剛剛提到的那種 每一個 3 * 3 處理一個空間次元資訊,即depthwise convolution 加 pointwise convolution 。
  • 後者是指inceptionV4裡面的那個結構,就是7 * 7 分解成 7 * 1 和1 * 7 的那種結構。

本論文中的深度可分離卷積和原始的深度可分離卷積有一些不同。

  • 第一點是本論文中是先進行通道次元的卷積(1 * 1 ),然後再進行空間次元的卷積(長寬方向的 3 * 3卷積),而原始的是先空間次元,再通道次元。
  • 第二點是,本論文中xception使用了激活函數Relu,而原生的深度可分離卷積沒有使用激活函數。

作者在随後緊接着說 順序不同并不重要,因為本來就是交替的堆疊嘛,誰先誰後都一樣的,當時第二點是否使用激活函數這點比較重要,作者也在後面會給出實驗結論。

後面一段作者給出了在本論文中對傳統卷積和深度可分離卷積的較為精準的定義。

  • 正常卷積: 一個卷積核處理所有通道。稱為single-segment case。
  • 深度可分離卷積: 一個卷積核處理一個通道。稱為one segment per channel。

inception遊走在這倆的中間,即沒有一個卷積核處理一個通道,也沒有‘極端’的一個卷積核處理一個通道。

3.Prior work(前人工作介紹)

這一章節大概看一下就行,作者就是在介紹本篇論文所參考的文獻以及前人的工作 包括借用的東西,他提到的大部分論文在之前都有看過了,這個部落格裡也有,像Lenet Alexnet VGG Zfnet Resnet inceptionV1234系列等。

後面一段作者說到深度可分離卷積最早在AlexNet裡就有了,我看到這懵了一下,Alex裡不是一條路走到黑的那種嘛,哪裡用到深度可分離卷積了,然後我就又去看了一下Alex,又查了查資料,發現這裡作者說的是類似于深度可分離卷積的思想,就是Alex裡的GPU資源不足而使用資料分開并行訓練的政策,有點分組卷積的意思。本段的後面又說inceptionV1和V2裡也有深度可分離卷積,額行吧 你說哪裡用到就哪裡用到了,我估計是那個寬度分解的思想類似于深度可分離卷積的思想把。

後面提到一個論文 MobileNets,這個論文還沒看過,好像是輕量化的一個網絡模型,小本本安排上了。

4.The Xception architecture(Xception結構介紹)

這一章節就是正式提出了Xception子產品,前面的介紹有提出了那個‘極緻’的假設,在這裡就直接用上了。就是 通道次元和空間次元的兩方面處理徹底分開,達到解耦的效果。

Xception有36個卷積層用于特征提取,36個卷積層放到14個子產品中,除了首尾子產品,其餘的都用線性殘差連接配接,說白了就是帶殘差的可分離深度卷積的堆疊呗。本段最後一局繼續對比一波其他模型,比VGG16和inception之前的版本好。

真是方面教材VGG了,我發現VGG之後的模型和論文都是對比VGG的,害。

5.Experimental evaluation(實驗)

這一章都是在說實驗細節,我一般實驗都是大概i看過去的,也沒什麼可說的,我将所有要知道的點列出來了。

總結幾個點:

  • FastEval14k 類似于是JFT的子資料集,在FastEval14k上跑模型,間接推斷JFT(3.5E個資料)資料集上的情況。
  • 資料集上每一張圖檔裡有好幾個分類,不像之前的imagenet裡一張圖檔就是一個分類,是以最後不用softmax。
  • 準确率性能評估比較特别,取top100,最後的結果是按照該分類在社交平台上的出現次數進行權重。
  • 優化器 RMSprop,動量0.9,初始lr0.001,學習率衰減0.9(每300W樣本)。
  • 正則化政策,權重衰減(L2正則化,),dropout(50%),輔助分類器(本論文中沒用這個政策)。
  • 在Tensorflow上部署,用了60塊 NVIDIA K80的顯示卡。
  • 使用并行政策,同步資料并行(synchronous),每一個GPU都處理一個完整的batch。這篇部落格我在說分組卷積的時候也提到了Alex,順帶再說一下,Alex的那個并行是将資料分成兩塊,每一塊資料用一個GPU進行訓練,而Xception的并行是資料并行,是不分資料的,因為這裡作者用了60塊GPU,是以将資料複制60份,每一份放到一塊GPU中訓練,最後所有結果求平均。
  • 後面作者也說在訓練JFT資料集的時候,因為JFT太大了,就使用了asynchronous的方法進行訓練,這個方法就是在上面說的Alex的方法,每一個batch分成60份交給60塊GPU去訓練(資料量太大訓練了三個月)。
  • 實驗和inceptionV3(無輔助分類)進行對比,imagenet資料集上 Xception比inceptionV3稍好一點,比VGG好,甚至比ResNet-152還好,在JFT上比inceptionV3好4.3%,在JFT上好這麼多的可能原因是,inceptionV3有針對imagenet資料集做專門的調參,而且調了很長時間,是以在imagenet上效果比較好,而在JFT上就稍差點。
  • 網絡模型參數量對比 AlexNet–6000W ,GoogleNet–700W,VGG–1.38E,Xception–2000W,MobileNet–200W.
  • 給Xecption加上殘差結構,網絡收斂的更快,準确度更高。
  • 第六頁 4.6第一段中的一個單詞 benchmark 意思為 以對照實驗方法測試。
  • 在1 * 1 卷積之後和深度可分離卷積之前不用激活函數效果最好。
  • 非線性激活函數隻對未解耦時有用,對1 * 1 卷積之後的feature map做非線性激活會丢失特征資訊,不利于後續空間次元上的可分離卷積。

總結

  • 介紹了傳統卷積和深度可分離卷積,并利用深度可分離卷積的思想造就了Xecption子產品。
  • Xecption子產品就是有解耦的思想,讓網絡先處理通道次元,再處理空間次元(長寬)資訊。
  • 先處理那個次元的資訊順序上并不重要。
  • 在1 * 1 之後,深度可分離卷積—空間次元處理之前不适用非線性激活函數效果最好。

繼續閱讀