參考博文:https://blog.csdn.net/c20081052/article/details/80703896 和 https://www.cnblogs.com/gujiangtaoFuture/articles/12096463.html
引言
卷積神經網絡(CNN)已經普遍應用在計算機視覺領域,並且已經取得了不錯的效果。圖1為近幾年來CNN在ImageNet競賽的表現,可以看到為了追求分類准確度,模型深度越來越深,模型復雜度也越來越高,如深度殘差網絡(ResNet)其層數已經多達152層。
然而,在某些真實的應用場景如移動或者嵌入式設備,如此大而復雜的模型是難以被應用的。首先是模型過於龐大,面臨着內存不足的問題,其次這些場景要求低延遲,或者說響應速度要快,想象一下自動駕駛汽車的行人檢測系統如果速度很慢會發生什么可怕的事情。所以,研究小而高效的CNN模型在這些場景至關重要,至少目前是這樣,盡管未來硬件也會越來越快。目前的研究總結來看分為兩個方向:一是對訓練好的復雜模型進行壓縮得到小模型;二是直接設計小模型並進行訓練。不管如何,其目標在保持模型性能(accuracy)的前提下降低模型大小(parameters size),同時提升模型速度(speed, low latency)。本文的主角MobileNet屬於后者,其是Google最近提出的一種小巧而高效的CNN模型,其在accuracy和latency之間做了折中。下面對MobileNet做詳細的介紹。
Depthwise separable convolution
MobileNet的基本單元是深度級可分離卷積(depthwise separable convolution),其實這種結構之前已經被使用在Inception模型中。深度級可分離卷積其實是一種可分解卷積操作(factorized convolutions),其可以分解為兩個更小的操作:depthwise convolution和pointwise convolution,如圖1所示。Depthwise convolution和標准卷積不同,對於標准卷積其卷積核是用在所有的輸入通道上(input channels),而depthwise convolution針對每個輸入通道采用不同的卷積核,就是說一個卷積核對應一個輸入通道,所以說depthwise convolution是depth級別的操作。而pointwise convolution其實就是普通的卷積,只不過其采用1x1的卷積核。圖2中更清晰地展示了兩種操作。對於depthwise separable convolution,其首先是采用depthwise convolution對不同輸入通道分別進行卷積,然后采用pointwise convolution將上面的輸出再進行結合,這樣其實整體效果和一個標准卷積是差不多的,但是會大大減少計算量和模型參數量。
這里簡單分析一下depthwise separable convolution在計算量上與標准卷積的差別。假定輸入特征圖大小是 ,而輸出特征圖大小是
,其中
是特征圖的width和height,這是假定兩者是相同的,而和指的是通道數(channels or depth)。這里也假定輸入與輸出特征圖大小(width and height)是一致的。采用的卷積核大小是盡管是特例,但是不影響下面分析的一般性。對於標准的卷積
,其計算量將是:
而對於depthwise convolution其計算量為: ,pointwise convolution計算量是:
,所以depthwise separable convolution總計算量是:
可以比較depthwise separable convolution和標准卷積如下:
一般情況下 比較大,那么如果采用3x3卷積核的話,depthwise separable convolution相較標准卷積可以降低大約9倍的計算量。其實,后面會有對比,參數量也會減少很多。
MobileNet網絡結構
前面講述了depthwise separable convolution,這是MobileNet的基本組件,但是在真正應用中會加入batchnorm,並使用ReLU激活函數,所以depthwise separable convolution的基本結構如圖3所示。
MobileNet的網絡結構如表1所示。首先是一個3x3的標准卷積,然后后面就是堆積depthwise separable convolution,並且可以看到其中的部分depthwise convolution會通過strides=2進行down sampling。然后采用average pooling將feature變成1x1,根據預測類別大小加上全連接層,最后是一個softmax層。如果單獨計算depthwise
convolution和pointwise convolution,整個網絡有28層(這里Avg Pool和Softmax不計算在內)。我們還可以分析整個網絡的參數和計算量分布,如表2所示。可以看到整個計算量基本集中在1x1卷積上,如果你熟悉卷積底層實現的話,你應該知道卷積一般通過一種im2col方式實現,其需要內存重組,但是當卷積核為1x1時,其實就不需要這種操作了,底層可以有更快的實現。對於參數也主要集中在1x1卷積,除此之外還有就是全連接層占了一部分參數。
MobileNet到底效果如何,這里與GoogleNet和VGG16做了對比,如表3所示。相比VGG16,MobileNet的准確度稍微下降,但是優於GoogleNet。然而,從計算量和參數量上MobileNet具有絕對的優勢。
MobileNet瘦身
前面說的MobileNet的基准模型,但是有時候你需要更小的模型,那么就要對MobileNet瘦身了。這里引入了兩個超參數:width multiplier和resolution multiplier。第一個參數width multiplier主要是按比例減少通道數,該參數記為 ,其取值范圍為(0,1],那么輸入與輸出通道數將變成
和
,對於depthwise separable convolution,其計算量變為:
因為主要計算量在后一項,所以width multiplier可以按照比例降低計算量,其是參數量也會下降。第二個參數resolution multiplier主要是按比例降低特征圖的大小,記為 ,比如原來輸入特征圖是224x224,可以減少為192x192,加上resolution multiplier,depthwise separable convolution的計算量為:
要說明的是,resolution multiplier僅僅影響計算量,但是不改變參數量。引入兩個參數會給肯定會降低MobileNet的性能,具體實驗分析可以見paper,總結來看是在accuracy和computation,以及accuracy和model size之間做折中。
MobileNet的TensorFlow實現
TensorFlow的nn庫有depthwise convolution算子tf.nn.depthwise_conv2d,所以MobileNet很容易在TensorFlow上實現:完整實現可以參見GitHub。
總結
本文簡單介紹了Google提出的移動端模型MobileNet,其核心是采用了可分解的depthwise separable convolution,其不僅可以降低模型計算復雜度,而且可以大大降低模型大小。在真實的移動端應用場景,像MobileNet這樣類似的網絡將是持續研究的重點。后面我們會介紹其他的移動端CNN模型。
參考資料
- MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Application