1. 程式人生 > >MobileNet v1 和 v2 記錄

MobileNet v1 和 v2 記錄

最近在搞檢測的cpu部署,對inference階段的響應時間有較高的要求,所以就對mobilenet的學習記錄一下。

一、MobileNet v1:

先上一個結構:

圖a就是我們知道的標準意義的卷積,這個卷積可以等價於Depthwise和1x1的卷積的結合。那麼為什麼可以這樣呢?我們先給出答案:

depthwise conv只對輸入通道進行卷積,沒有對其進行組合來產生新的特徵。因此下一層利用另外的層利用1x1卷積來對深度卷積的輸出計算一個線性組合從而產生新的特徵。

depthwise卷積:逐一通道處理的的二維卷積。這個概念可能比較難以理解,下面我詳細的說一下什麼是depthwise,各位看官也可以看看caffe實現的depthwise卷積。假設原來是3*3的卷積,那麼depthwise separable convolution就是先用M個3*3卷積核一對一卷積輸入的M個feature map,不求和,生成M個結果

;然後用N個1*1的卷積核正常卷積前面生成的M個結果,求和,最後生成N個結果。見下圖:

注意 : 這裡卷積用 M 個,即與輸入feature map通道數相同 ,而不是輸出通道數 N 

Mobilenet的結構定義如下:

深度卷積對每個通道使用一種卷積核,可以寫成:Gk,l,m=∑i,jKi,j,m⋅Fk+i−1,l+j−1,mGk,l,m=∑i,jKi,j,m⋅Fk+i−1,l+j−1,m,其中K^K^是深度卷積核的尺寸DK∗DK∗MDK∗DK∗M,K^K^中第m個卷積核應用於F中的第m個通道來產生第m個通道的卷積輸出特徵圖G^G^。 
深度卷積的計算量為:DK∗DK∗M∗DF∗DFDK∗DK∗M∗DF∗DF。 

這裡基本就是v1裡面比較重要的內容了,但是呢在很多情況下mobilenet的引數仍然過多,需要減少,所以作者引入了寬度乘法器和解析度乘法器的概念,即:核心層的深度可分離卷積加上寬度乘法器α以及解析度乘法器ρ來表達計算量:

 

二、MobileNet v2:

我們熟悉了v1的結構後來看v2,首先Mobilenet v2和v1的區別和其自身的創新如下:

1. Inverted residuals,通常的residuals block是先經過一個1*1的Conv layer,把feature map的通道數“壓”下來,再經過3*3 Conv layer,最後經過一個1*1 的Conv layer,將feature map 通道數再“擴張”回去。即先“壓縮”,最後“擴張”回去。 


而 inverted residuals就是 先“擴張”,最後“壓縮”。為什麼這麼做呢?請往下看。

在上圖中,我們可以看到:

a、ResNet是:壓縮”→“卷積提特徵”→“擴張”,MobileNetV2則是Inverted residuals,即:“擴張”→“卷積提特徵”→ “壓縮”:經過1x1的卷積可以擴大通道數,提升其抽取特徵的能力。

b、最後不採用Relu,而使用Linear代替:

Relu對於負的輸入,輸出全為零;而本來特徵就已經被“壓縮”,再經過Relu的話,又要“損失”一部分特徵,因此這裡不採用Relu。

總結:在通道數較少的層後,應該用線性啟用代替ReLU。MobileNet V2的Linear bottleneck Inverted residual block中,降維後的1X1卷積層後接的是一個線性啟用,其他情況用的是ReLU。

2.Linear bottlenecks,為了避免Relu對特徵的破壞,在residual block的Eltwise sum之前的那個 1*1 Conv 不再採用Relu。

下圖即為Inverted residuals的bottleneck,一個bottleneck由如下三個部分構成:

下圖即為mobilenet v2的網路結構圖:

其中:t表示“擴張”倍數,c表示輸出通道數,n表示重複次數,s表示步長stride。 
先說兩點有誤之處吧: 
1. 第五行,也就是第7~10個bottleneck,stride=2,解析度應該從28降低到14;如果不是解析度出錯,那就應該是stride=1; 
2. 文中提到共計採用19個bottleneck,但是這裡只有17個。

引用:https://zhuanlan.zhihu.com/p/33169767

https://zhuanlan.zhihu.com/p/39386719

https://blog.csdn.net/u011995719/article/details/79135818