Google在2017年上半年發表了一篇關於能夠運行在手機等移動設備上的神經網絡結構——MobileNets。MobileNets是基於深度可分離卷積(depthwise separable convolution)而設計的輕量級深度神經網絡。這文章也介紹了兩個超參數能夠很好的平衡延時與精度,這兩個超參數可使人更方便地選出本身想要的網絡結構。MobileNets的結構能用在圖片分類、人臉識別、目標檢測等上面。論文的mxnet代碼已經開源,tensorflow的相關代碼也開源了。html
在上一篇博客中——ShuffleNet總結中已經說明過卷積的計算了,與這裏卷積相關計算有一點不一樣的是:這論文中長度爲\(n\)方陣計算的複雜度直接設爲\(n^2\),而我在前一篇博客中設爲\(n^3\),實際上能優化到\(n^{2.376}\),加上openmp等多核多線程技術,方陣計算複雜度爲\(n^2\)是合理的。git
論文中的主要的思想是將一個標準卷積(standard convolution)分解成兩個卷積,一個是深度卷積(depthwise convolution),這個卷積應用在每個輸入通道上;另外一個是\(1 \times 1\)的逐點卷積(pointwise convolution),這個卷積合併每個深度卷積的輸出。github
爲何標準卷積能分解,怎麼分解?先來看下論文給出的分解方法。如圖一所示:apache
事實上標準卷積的分解能夠用矩陣乘法來理解。在上一篇博客中——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} \]spa
獲得的\({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所示:設計
對於標準卷積來講,根據式(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} \]
能夠看到先後的計算量是小了不少的。
通過上面的說明能夠看得MoblieNets的結構如圖3所示:
這兩個超參數也是至關容易理解的,一個是減少輸出通道數\(N\),一個是減小輸入圖片的大小(退出是分辨率resolution)。
若是上面輸出的通道數都是原來的\(\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所示。
這個用於控制輸入圖片的大小,輸入的圖片越小,後面的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大小爲基準線,那麼輸入大小通常建議取爲19二、160與128。具體結果如圖4所示。
MobileNets基以上面幾種技術,訓練出來的網絡能很好地用於各種視覺任務,好比目標檢測、分類等。
【防止爬蟲轉載而致使的格式問題——連接】:
http://www.cnblogs.com/heguanyou/p/8100246.html