深度可分卷積(Depthwise Separable Conv.)計算量分析


上次讀到深度可分卷積還是去年暑假,各種細節都有些忘了。記錄一下,特別是計算量的分析過程。

1. 標准卷積和深度可分卷積


標准卷積(MobileNet論文中稱為Standard Convolution,如下圖所示)將N個大小(邊長)為\(D_{k}\)、通道數為M的卷積核作用於大小為\(D_{f}\)、通道數同為M的特征圖上,最后得到大小為Dp、通道數為N的輸出。即標准卷積的每個卷積和的通道數需要與輸入特征圖的通道數相同,且輸出特征圖的通道數等於卷積核的個數。(以上均為保證文章完整性的廢話)

深度可分卷積(Depthwise Separable Convolution)其實就是將標准的卷積分為兩部分:

  1. 第一部分是對輸入的特征圖的每一個通道單獨做卷積,因此這里的卷積核通道數自然也都是1,卷積核的大小仍為\(D_{k}\),這部分稱為Depthwise Convolution
  2. 第二部分是對第一部分得到的M個特征圖做1 x 1卷積,卷積核個數為N,因此最后的輸出同樣是\(D_{p}^2 \cdot N\),這部分稱為Pointwise Convolution

舉個簡單的例子說明,假設我們有一個輸入圖片,這個輸入圖片的維度是11 x 11 x 3,標准卷積為3 x 3 x 3 x 6(假設stride為2,padding為1),那么可以得到輸出為6 × 6 × 16(6 = (11-3+2*1)/2+1)的輸出結果。現在輸入圖片不變,先通過一個維度是3 × 3 × 1 × 3的深度卷積(輸入是3通道,這里有3個卷積核分別作用在3個通道上),得到6 × 6 × 3的中間輸出,然后再通過一個維度是1 × 1 × 3 ×16的1 ×1卷積,同樣得到輸出為6 × 6 × 16。

2. 計算量分析


標准卷積的計算量
記得第一次跟着論文算時,一直盯着輸入特征圖和卷積核,這樣還要考慮padding、stride等等,實際算起來很麻煩。其實只要換個思路,先看輸出特征圖和卷積核,因為輸出特征圖中的每一層的每個像素都是一次卷積的結果,因此每次卷積的計算量為:\(D_{k}^2 \cdot M\),每個卷積核的計算量為: \(D_{p}^2 \cdot D_{k}^2 \cdot M\),一共N個卷積核,所以總計算量為:\(D_{p}^2 \cdot D_{k}^2 \cdot M \cdot N\)

深度可分卷積的計算量
如下圖,Depthwise卷積的計算量為:\(D_{p}^2 \cdot D_{k}^2 \cdot M\)

如下圖,Pointwise卷積的計算量為:\(D_{p}^2 \cdot M \cdot N\)

所以,在輸入、輸出特征圖、卷積核大小不變的情況下,深度可分卷積的計算量為標准卷積的:

\[\cfrac{D_{p}^2 \cdot D_{k}^2 \cdot M + D_{p}^2 \cdot M \cdot N}{D_{p}^2 \cdot D_{k}^2 \cdot M \cdot N} = \cfrac{1}{N} + \cfrac{1}{D_{k}^2} \]

因為所有的輸出特征圖大小均為\(D_{p}\), 即每次卷積的次數相同。在上式中分子分母同時除以\(D_{p}^2\),得到:\(\cfrac{D_{k}^2 \cdot M + M \cdot N}{D_{k}^2 \cdot M \cdot N}\),剛好分別是深度可分卷積和標准卷積的參數量。

3. 原理分析


深度可分卷積默認一個假設,即標准卷積核在特征圖的通道維度映射中,存在一種類似線性組合的分解特性。標准卷積核需要同時學習空間上的相關性和通道間的相關性,深度可分卷積將這兩種相關性顯式地分離開來,從上面的圖中也能看出,深度可分卷積其實是將標准卷積分為空間(Depthwise)的卷積和通道(Pointwise)的卷積(這個和Xception很類似,MobileNet論文還引用了Xception,但是說兩篇文章的目的不一樣,MobileNet對可分卷積帶來的效率與空間節省方面的好處更感興趣,而Xception更糾結於根據可分卷積設計出來的網絡是否具備很好的准確性。反正我是不清楚MobileNet咋投出去了的,我佛了,居然是相互引用,好像還是MobileNet在前)。我們用\(K\)表示一個標准卷積核,則:

\[K=M \cdot \Lambda(b) \tag{1} \]

其中,"\(\cdot\)"表示一種特殊的矩陣乘法,其運算法則參考(3)式,b是一個m維矩陣”向量”(Matrix Spaces),它的每個元素(element)是一個\(s \times s\)大小的2維卷積核:

\[b_{i}= \left[ \begin{matrix} b_{11}^i & \cdots & b_{1s}^i \\ \vdots & \ddots & \vdots \\ b_{s1}^i & \cdots & b_{ss}^i \end{matrix} \right] \]

\(\Lambda(b)\)表示\(b_{i}\)為對角元素的對角陣,即:

\[\Lambda(b)= \left[ \begin{matrix} b_{1} & 0 & \cdots & 0 \\ 0 & b_{2} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & b_{m} \end{matrix} \right] \tag{2} \]

\(M\)是一個\(n \times m\)的數值矩陣,n行數表示輸出特征圖的維度(output channels number),m表示輸入特征圖的維度(input channels number)。為了直觀,把式(1)寫下面的形式:

\[\left[ \begin{matrix} k_{11} & \cdots & k_{1m} \\ \vdots & \ddots & \vdots \\ k_{n1} & \cdots & k_{nm} \end{matrix} \right]= \left[ \begin{matrix} \mu_{11}b_{1} & \cdots & \mu_{1m}b_{m} \\ \vdots & \ddots & \vdots \\ \mu_{n1}b_{1} & \cdots & \mu_{nm}b_{m} \end{matrix} \right]= \left[ \begin{matrix} \mu_{11} & \cdots & \mu_{1m} \\ \vdots & \ddots & \vdots \\ \mu_{n1} & \cdots & \mu_{nm} \end{matrix} \right] \cdot \left[ \begin{matrix} b_{1} & \cdots & 0 \\ \vdots & \ddots & \vdots \\ 0 & \cdots & b_{m} \end{matrix} \right] \tag{3} \]

其中,\(k_{ij}=\mu_{ij}b_{j}\)是一個\(s \times s\)的數值矩陣,表示4維常規卷積核中的一個2維小卷積核。 然后,利用式(3)來分析模型參數量的壓縮程度,可以得到壓縮率為:

\[\cfrac{s \times s \times m + n \times m}{s \times s \times n \times m}= \cfrac{1}{n}+\cfrac{1}{s \times s} \]

容易發現,這個結果跟論文中計算量減少率是一樣,因為MobileNet從本質上就是基於這種核分解假設而設計的。

關於上述分析的思考
開始看到這個分解的時候感覺很巧妙,但是仔細思考之后又感覺有點問題。

因為在(3)式中,從第1個矩陣(記為X)到第2個矩陣(記為Y),以X的第1列為例,這一列的每一個元素\(k_{i1}\)在Y中都被表示為 \(\mu_{i1}b_{1}\)\(i\in[1,n]\)。而根據下面參數量的分析,\(n \times m\)指的就是(3)式中的第3個矩陣,這樣,\(\mu_{i1}\)都是數,而\(b_{1}\)都是矩陣,可以推出這一列的每個元素都線性相關,即X的第1列中每個元素都線性相關,以此類推,X第2、3...m列中的每個元素都分別線性相關。

X為4維標准卷積核(4維分別是卷積核的寬、高、通道數和個數),所以X的每一行表示一個卷積核(一個4維標准卷積核包含n個3維卷積核),從1到m表示這個卷積核的m個通道;而每一列則表示n個3維卷積核的相同通道;X的每個元素都表示一個2維卷積。按照上一段的分析,X每一列中的元素都分別線性相關,所以可以得出要滿足這種分解,1到n這n個3維卷積核對應通道都線性相關。這樣的話,那不是無形中給標准卷積轉換到深度可分卷積添加了條件,只有滿足這種條件的標准卷積才能進行分解?而這也與實驗中的事實不符。

所以我有點疑惑,是我理解有誤還是作者(參考4)的這種矩陣分解的解釋有問題?搜了一下這個矩陣分解的解釋,都是引用的(參考4)。在評論區和作者討論之后,感覺他沒理解我的意思(確實不好表達),所以沒好意思繼續問下去(一寫又是一大堆)。暫時先放一放了,如果有人看到這篇博客,歡迎和我討論。

參考:

  1. https://www.geeksforgeeks.org/depth-wise-separable-convolutional-neural-networks/
  2. https://cuijiahua.com/blog/2018/02/dl_6.html
  3. https://www.leiphone.com/news/201708/KGJYBHXPwsRYMhWw.html
  4. https://blog.csdn.net/sun_28/article/details/78170878(寫的很詳細)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM