讀論文:MobileNetV2
論文:Inverted Residuals and Linear Bottlenecks: Mobile Networks for Classification, Detection and Segmentation。
原文:
實現:
摘要
在本文中,我們描述了一種新的移動架構MobileNetV2,該架構提高了移動模型在多個任務和多個基準資料集上以及在不同模型尺寸範圍內的最佳效能。MobileNetV2架構基於倒置的殘差結構,其中快捷連線位於窄的瓶頸層之間。中間展開層使用輕量級的
深度卷積
作為非線性源來過濾特徵。網路的名字是Mobilenet V2,很明顯可以看出是對Mobilenet的改進。
本文的主要貢獻是一個新的層模組:具有線性瓶頸的倒置
殘差
。該模組將輸入的低維壓縮表示首先擴充套件到高維並用輕量級深度卷積進行過濾。隨後用
線性卷積
將特徵投影回低維表示。
方法
1. 深度可分離卷積
基本思想是用分解版本替換完整的卷積,將卷積拆分為兩個單獨的層。第一層稱為深度卷積,它透過對每個輸入通道應用單個卷積濾波器來執行輕量級濾波。第二層是1×1卷積,稱為逐點卷積,它負責透過計算輸入通道的線性組合來構建新特徵。
標準卷積
使用
維的輸入張量
,並對其應用卷積核
來產生
維的輸出張量
。標準卷積層的計算代價為
,深度可分卷積是標準卷積層的直接替換。它們幾乎與常規卷積一樣工作,但其成本為:
它是深度方向和1×1逐點卷積的總和。深度可分卷積與傳統卷積層相比有效地減少了幾乎
倍的計算量。MobileNetV2使用k=3(3×3的深度可分卷積),因此計算成本比標準卷積小8到9倍,但精度只有很小的降低。
深度分類卷積示例:
輸入圖片的大小為(6,6,3) ,原卷積操作是用(4,4,3,5) 的卷積(4×4是卷積核大小,3是卷積核通道數,5個卷積核數量),stride=1,無padding。輸出的特徵尺寸為
即輸出的特徵對映為(3,3,5)
將標準卷積中選取序號為n nn的卷積核,大小為(4,4,3) ,標準卷積過程示意圖如下(注意省略了偏置單元):
黑色的輸入為(6,6,3)與第n個卷積核對應,每個通道對應每個卷積核通道卷積得到輸出,最終輸出為2+0+1=3。(這是常見的卷積操作,注意這裡卷積核要和輸入的通道數相同,即圖中表示的3個通道~)
對於深度分離卷積,把標準卷積(4,4,3,5) 分解為:
深度卷積部分:大小為(4,4,1,3),作用在輸入的每個通道上,輸出特徵對映為(3,3,3)
逐點卷積部分:大小為(1,1,3,5) ,作用在深度卷積的輸出特徵對映上,得到最終輸出為(3,3,5)
例中深度卷積卷積過程示意圖如下:
輸入有3個通道,對應著有3個大小為(4,4,1) 的深度卷積核,卷積結果共有3個大小為(3,3,1) (3,3,1),我們按順序將這卷積按通道排列得到輸出卷積結果(3,3,3) 。相比之下計算量減少了:
4×4×3×5轉為了4×4×1×3+1×1×3×5即引數量減少了:
MobileNet使用可分離卷積減少了8到9倍的計算量,只損失了一點準確度。
2. 線性瓶頸
考慮一個由n層
組成的深度神經網路,每層都有一個
維的啟用張量,稱經過啟用層後的
張量
為
感興趣流形
,作者認為
神經網路
中的流形可以嵌入到低維子空間中。換句話說,當我們觀察深度卷積層的所有單個d通道畫素時,這些值中編碼的資訊實際上存在於某個流形中,而這個流形又可嵌入到
低維子空間
中。也就是說實際中的
感興趣流形並不是D channel的所有資訊,只是一個它的一個低維子空間
。這似乎意味著降低
空間維度
就可以解決問題了,為了避免Relu對特徵的破壞,在
residual block
的Eltwise sum之前的那個 1*1 Conv 不再採用Relu
先看看MobileNetV2 和 V1之間的不同。
主要是兩點:
Depth-wise convolution之前多了一個1*1的“擴張”層,目的是為了提升通道數,獲得更多特徵;
最後不採用Relu,而是Linear,目的是防止Relu破壞特徵。
在MobileNet V1中除了引入depthwise separable convolution代替傳統的卷積,還做了一個實驗是用width multiplier引數來做模型通道的縮減,相當於給模型“瘦身”,這樣特徵資訊就能更集中在縮減後的通道中,但是如果此時加上一個非線性啟用層,比如ReLU,就會有較大的資訊丟失,因此為了減少資訊丟失,就有了文中的
linear bottleneck
,意思就是bottleneck的輸出不接非線性啟用層,所以是linear
對於ReLU層輸出的非零值而言,ReLU層起到的就是一個線性變換的作用,這個從ReLU的曲線就能看出來。
ReLU層可以保留input manifold的資訊,但是隻有當input manifold是輸入空間的一個低維子空間時才有效。
通俗的來說就是,要想提升效果,維度是要降的,但channel數較低時透過relu層會有相對高的機率使較多的輸出為0,要想不為0,就不使用relu,相當於接了個線性分類器
3. 倒置殘差(Inverted residuals)
Figure2展示了從傳統卷積到depthwise separable convolution再到本文中的inverted residual block的差異。(a)表示傳統的3*3卷積操作,假設輸入channel數量為n,那麼(a)中紅色立方體(卷
積核
)的維度就是3*3*n。(b)就是在MobileNet V1中採用的depthwise separable convolution。(c)是在(b)的基礎上增加了一個類似bottleneck的操作(最窄的那個)。(d)和(c)在本質上是一樣的,想象無數個相連的(c)和無數個相連的(d)。另外要注意的是在(c)和(d)中虛線框後面是沒有啟用層的,這正是前面第一部分的內容。(d)正是本文MobileNet V2的inverted residual block結構,和原來ResNet中residual block對
維度
的操作正好是相反的。
總領起來看一下:
對於mobilenet V2的每個bottleneck residual block,先進行升維,在接dw layer+relu,最後在降維+linear,並且還做了skip connection
MobileNet-V2網路結構
其中:t表示“擴張”倍數,c表示輸出通道數,n表示重複次數,s表示步長stride。圖中有幾個問題:1、文中說有19層,但是在table2中只有17層。2、第6行的input應該是14*14*64,而不是28*28*64,因為第5行採用的是stride=2的卷積。3、最後一行的input應該是1*1*1280,而不是1*1*k。表中的t表示
expansion factor
,也就是每個inverted residual block的第一個1*1卷積的升維比率,比如第三行的輸入channel是16,則每個inverted residual block的第一個1*1卷積的輸入channel是16,輸出channel是16*6。
Conv2d 和avgpool和傳統CNN裡的操作一樣;最大的特點是bottleneck,一個bottleneck由如下三個部分構成:
這就是之前提到的inverted residuals結構,一個inverted residuals結構的Multiply Add=
h*w*d’ * 1*1*td’ +
h*w*td’ * k*k*1 +
h*w*t d’ * 1*1*d” =
h*w*d’*t(d’+ k*k + d”)
特別的,針對stride=1 和stride=2,在block上有稍微不同,主要是為了與shortcut的維度匹配,因此,stride=2時,不採用shortcut。 具體如下圖:
看看MobileNet-V2 分類時,
inference速度
: