天天看點

MobileNets總結

Google在2017年上半年發表了一篇關于可以運作在手機等移動裝置上的神經網絡結構——[MobileNets](https://arxiv.org/abs/1704.04861)。MobileNets是基于深度可分離卷積(depthwise separable convolution)而設計的輕量級深度神經網絡。這文章也介紹了兩個超參數可以很好的平衡延時與精度,這兩個超參數可以使人更友善地選出自己想要的網絡結構。MobileNets的結構能用在圖檔分類、人臉識别、目标檢測等上面。論文的[mxnet代碼](https://github.com/apache/incubator-mxnet/blob/master/example/image-classification/symbols/mobilenet.py)已經開源,tensorflow的相關代碼也開源了。

Google在2017年上半年發表了一篇關于可以運作在手機等移動裝置上的神經網絡結構——MobileNets。MobileNets是基于深度可分離卷積(depthwise separable convolution)而設計的輕量級深度神經網絡。這文章也介紹了兩個超參數可以很好的平衡延時與精度,這兩個超參數可以使人更友善地選出自己想要的網絡結構。MobileNets的結構能用在圖檔分類、人臉識别、目标檢測等上面。論文的mxnet代碼已經開源,tensorflow的相關代碼也開源了。

深度可分離卷積(depthwise separable convolution)

在上一篇部落格中——ShuffleNet總結中已經說明過卷積的計算了,與這裡卷積相關計算有一點不同的是:這論文中長度為\(n\)方陣計算的複雜度直接設為\(n^2\),而我在前一篇部落格中設為\(n^3\),實際上能優化到\(n^{2.376}\),加上openmp等多核多線程技術,方陣計算複雜度為\(n^2\)是合理的。

論文中的主要的思想是将一個标準卷積(standard convolution)分解成兩個卷積,一個是深度卷積(depthwise convolution),這個卷積應用在每一個輸入通道上;另一個是\(1 \times 1\)的逐點卷積(pointwise convolution),這個卷積合并每一個深度卷積的輸出。

分解

為什麼标準卷積能分解,怎麼分解?先來看下論文給出的分解方法。如圖一所示:

MobileNets總結

圖1 标準卷積的分解

事實上标準卷積的分解可以用矩陣乘法來了解。在上一篇部落格中——ShuffleNet總結卷積的計算時,如果卷積核\(K\)為\(D_K \times D_K \times M \times N\),輸入的\(D_F \times D_F \times M\)張量\(F\)(也叫Feature),輸出的\(D_F \times D_F \times N\)張量\(G\)(這裡都采用了論文中的符号,\(D_K\)為卷積核的長與寬,\(M\)是是輸入的通道數,\(N\)輸出通道數,\(D_F\)是Feature的長與寬),先要将\(F\)轉換成一個\((M \times D_K \times D_K) \times (D_F \times D_F)\)矩陣(就是im2col),卷積核\(K\)轉換為\(N \times(M \times D_K \times D_K)\)。

卷積核這個矩陣可以分解成兩個矩陣\(DW\)與\(PW\)的乘積,其中\({DW}\)代表depthwise convolution,\({PW}\)代表pointwise convolution。\(DW\)的shape為如圖1b)所示的\(M \times (1 \times D_k \times D_k)\),\(DP\)的shape為如圖1c)所示的\(N \times (M \times 1 \times 1)\),是以這兩個相乘的shape剛好是卷積核\(K\)的shape:

\[K_{N \times(M \times D_K \times D_K)}={PW}_{N \times (M \times 1 \times 1)} \times {DW}_{M \times (1 \times D_k \times D_k)} \tag{1.1}

\]

标準卷積計算

可以證明分解出來的兩個卷積核與一個标準卷積核是等價的。标準卷積下的計算方法以下:

\[G_{N \times (D_F \times D_F)} = K_{N \times(M \times D_K \times D_K)} \times F_{(M \times D_K \times D_K) \times (D_F \times D_F)} \tag{1.2}

分解後的計算

分解成兩個卷積後,先與第一個卷積核\(DW\)卷積,由于這個卷積核作用于每一個輸入的通道,實作上就是分組了,一共分成了M組,這個需要循環計算M次:

\[{G1}_{M \times (D_F \times D_F)} = {DW}_{M \times(1 \times D_K \times D_K)} \times F_{(M/M \times D_K \times D_K) \times (D_F \times D_F)} \tag{1.3}

得到的\({G1}\)再轉換成一個\((M \times 1 \times 1) \times (D_F \times D_F)\)矩陣\({G2}\),再通過與\({PW}\)卷積可得:

\[{G3}_{N \times (D_F \times D_F)} = {PW}_{N \times(M \times 1 \times 1)} \times {G2}_{(M \times 1 \times 1) \times (D_F \times D_F)} \tag{1.4}

分解前後單元網絡結構對比如圖2所示:

MobileNets總結

圖2 分解前後的對比圖

計算複雜度

對于标準卷積來說,根據式(1.2)可以看到計算量為:

\[Cost_{std} = D_K \times D_K \times M \times N \times D_F \times D_F \tag{1.5}

對于分解後的卷積,根據式(1.3)與式(1.4)可以看到計算量為:

\[Cost_{sep} = D_K \times D_K \times M \times D_F \times D_F + M \times N \times D_F \times D_F\tag{1.6}

分解前後的計算量之比是:

\[p = \frac{Cost_{sep}}{Cost_{std}} = \frac{1}{N} + \frac{1}{D_K^2} \tag{1.7}

可以看到前後的計算量是小了很多的。

MobileNets結構

經過上面的說明可以看得MoblieNets的結構如圖3所示:

MobileNets總結

圖3 MobileNets的網絡結構

兩個超參數

這兩個超參數也是相當容易了解的,一個是減小輸出通道數\(N\),一個是減少輸入圖檔的大小(退出是分辨率resolution)。

Width Multiplier \(\alpha\)

如果上面輸出的通道數都是原來的\(\alpha\)倍,那麼我們可以知道計算量由式(1.6)變為:

\[Cost_{sep}^\alpha = D_K \times D_K \times \alpha M \times D_F \times D_F + \alpha M \times \alpha N \times D_F \times D_F\tag{1.8}

由于\(D_K\)一般比\(N\)小很多,是以計算量與參數量都大約是\(\alpha =1\)(MobileNets的基準線)時的\(\alpha^2\)倍。\(\alpha\)一般取值為0.25,0.5,0.75和1。比如的結果如圖4所示。

Resolution Multipliter \(\rho\)

這個用于控制輸入圖檔的大小,輸入的圖檔越小,後面的feature也會相于地變小,是以能減小計算量,但是并不能減小參數量,因為這個對于卷積核的大小沒有影響,計算計算量由式(1.8)變為:

\[Cost_{sep}^{\alpha\rho} = D_K \times D_K \times \alpha M \times \rho D_F \times \rho D_F + \alpha M \times \alpha N \times \rho D_F \times \rho D_F\tag{1.9}

可以明顯地看到,計算量為原來的\(\rho^2\)倍,如果以224大小為基準線,那麼輸入大小一般建議取為192、160與128。具體結果如圖4所示。

MobileNets總結

圖4 兩個超參數對準确率、計算量與參數量的影響。

結語

MobileNets基以上面幾種技術,訓練出來的網絡能很好地用于各類視覺任務,比如目标檢測、分類等。

【防止爬蟲轉載而導緻的格式問題——連結】:

http://www.cnblogs.com/heguanyou/p/8100246.html

繼續閱讀