論文題目:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
文獻地址:https://arxiv.org/abs/1704.04861?context=cs
(非官方)源碼地址:
(1)Pytorch實現:https://github.com/rwightman/pytorch-image-models
(2)Caffe實現:https://github.com/shicai/MobileNet-Caffe
(3)TensorFlow實現MobileNet - YOLOV3: https://github.com/GuodongQi/yolo3_tensorflow
MobileNet V1中提到的輕量級深度分離卷積的思想在MobileNet V2,MnasNet,MobileNet V3,以及單目標追蹤算法SiamMask中均得以運用。雖然單獨使用MobileNet V1的場景不多,但是了解其思想,對於后續論文的理解有鋪墊性的作用。
移動端神經網絡現狀
MobileNet的提出是針對移動或者嵌入式的應用場景。大而復雜的模型是難以在嵌入式、FPGA等移動端使用的。視覺模型在移動端使用有兩大難題:
- 模型過於龐大,容易造成硬件內存不足的問題;
- 大多場景要求低延遲、響應速度快。【自動駕駛的行人檢測如果響應速度慢,則會發生比較可怕的事情】
因此,研究小而精確的模型對於現實的應用場景十分重要。
目前的兩大解決策略:
- 對訓練好的復雜模型進行壓縮得到小模型; ☆☆☆☆☆
- 直接對小模型進行訓練;
保證模型的性能,降低模型的大小,提升模型的速度。
MobileNet屬於后者,其使用了Depth wise separable convolutions。降低了卷積運算的參數量和運算量。
其可以用於目標檢測,提出的核心思想是輕量級的卷積運算。在實際應用中,通常會有人選擇其升級版MobileNet V2 作為一個快速目標識別的網絡,用於獲取patch給追蹤算法。
核心思想
MobileNet最核心的層就是深度可分離卷積的設計【depth wise separable convolutions】。
深度可分離卷積是將普通卷積分離為深度卷積和1*1卷積。
深度卷積的意思就是針對每個輸入通道采用不同的卷積核,一個卷積核對應一個輸入通道,也就是說,雖然有M個卷積核,但總共只有標准卷積的1個卷積核的大小。【一個卷積核是單通道的,M個卷積核相當於對輸入的每一個通道,每一個通道對應一個1通道的卷積核。M個卷積核也就是一個與輸入feature map 相同通道數量的卷積核。】其實可以理解,為什么要將標准卷積層換分為兩個部分:
☐ depth wise 的卷積是每一個通道對應一個一層的卷積核,每個通道都對應一個卷積核,這樣經過卷積運算后,通道數量不會發生變化。 所以需要1*1卷積進行通道數量的調整。
【深度卷積:depthwise convolution; 1*1卷積: pointwise convolution】
- 下圖(a)中是標准的卷積操作,輸入feature map的通道數量為M,則N個卷積核的通道數量均為M;
- 圖(b)中是深度可分離卷積操作,輸入feature map的通道數量為M,每一個通道對應一個卷積核,這樣M個卷積核的參數量相當於只有標准卷積操作一個卷積核;
- 圖(c)中是N個通道數量M的1*1卷積操作,由於圖(b)中的輸出結果的通道數量不會發生變化,也為M,因此,需要1*1卷積進行通道數量的調整。
情形:對於輸入feature map F[維度為Df * Df * M] ,輸出的feature map G[維度為Dg * Dg * N]
- 標准卷積的卷積核的參數量為 Dk * Dk * M * N [Dk表示卷積核的尺寸]。
如果步長為1,padding也為1,則其對應的計算:
將會對應計算量為:
- 深度可分離卷積:
深度卷積計算形式:
運算量 (從結構圖中也可以看出,運算量少N-1個卷積核的操作):
深度分離卷積運算量:
一般情況下 N 比較大,那么如果采用3x3卷積核,depthwise separable convolution相較於標准卷積可以降低大約9倍的計算量。
網絡結構
在實際應用中會添加BN和ReLU層。
The full architecture of MobileNet V1 consists of a regular 3×3 convolution as the very first layer, followed by 13 times the above building block.
整體的網絡結構中,包含一個常規的3*3卷積作為第一層,之后包含了13個上述的Depthwise Separable Convolutional block。 Depthwise Separable Convolutional block中沒有池化層,而是使用步長為2的DW操作進行下采樣。PW操作會2倍放大通道數量。如果輸入圖像的尺寸為 224×224×3,最終網絡的輸出則為7×7×1024。激活函數使用ReLU6。
y = min(max(0, x), 6)
最后呢,還會再加上一個平均池化操作和全連接層,全連接層使用softmax激活函數。
總結
MobileNet V1版本結構其實非常簡單,從網絡結構上看,其結構是一個非常復古的直筒結構,類似於VGG。這種結構性價比不高,后續一系列的ResNet、DenseNet等結構已經證明通過復用圖像特征,使用concat/eltwise+等操作進行特征融合,能極大提升網絡的性價比。
MobileNet V1版本中,Depthwise Conv確實是大大減少了參數量,也降低了計算量。而且N×N 的DW + 1×1的PW的結構在性能上也能接近N × N 的Conv。但是在實際使用中會發現,Depthwise (DW)部分的Kernel容易訓練廢掉: 即訓練之后發現depthwise訓練出來的kernel有不少是空的。depthwise每個kernel dim 相對於vanilla conv要小得多, 過小的kernel_dim, 加上ReLU的激活影響下, 使得神經元輸出很容易變為0, 所以就學廢了。 ReLU對於0的輸出的梯度為0, 所以一旦陷入了0輸出, 就沒法恢復了。