天天看點

擴充卷積詳解 - 組卷積, 深度可分離卷積, 空洞卷積

文章目錄

    • 零. Standard Convolution - 标準卷積
    • 一. Group Convolution - 組卷積
    • 二. Depth Separable Convolution - 深度可分離卷積
    • 三. Dilated Convoluton - 擴張卷積
    • 四. 參考

在标準卷積的基礎上介紹組卷積, 深度可分離卷積, 空洞卷積.

零. Standard Convolution - 标準卷積

标準卷積運算是這樣地:

擴充卷積詳解 - 組卷積, 深度可分離卷積, 空洞卷積

對于輸入特征為 C ∗ H ∗ W C*H*W C∗H∗W, 卷積核大小為 K ∗ K K*K K∗K, 共 N 個卷積核. 則:

  • 對于輸出特征圖上的每一個點, 都是在輸入特征圖的所有通道上執行 add 操作得到.
  • 輸出特征圖的通道數為 N N N.
  • 每個卷積核的尺寸為 C ∗ K ∗ K C*K*K C∗K∗K.
  • N 個卷積核的總參數量為 N ∗ C ∗ K ∗ K N*C*K*K N∗C∗K∗K.

輸入特征圖與輸出特征圖的連接配接方式如下圖所示:

擴充卷積詳解 - 組卷積, 深度可分離卷積, 空洞卷積

一. Group Convolution - 組卷積

最早出現分組卷積的是 AlexNet. 分組卷積, 顧名思義就是将原始卷積中的輸入特征按照通道進行分組, 每個組卷積隻對同組通道内的特征圖執行卷積運算.

擴充卷積詳解 - 組卷積, 深度可分離卷積, 空洞卷積

給定, 輸入特征圖為: C × H × W C×H×W C×H×W, 卷積核大小為 K × K K×K K×K, 卷積核共有 N 個. 我們按照通道數分為 g 個組, 一般來講, g 應該可以被 N 整除. 則:

  • 每個組的特征通道數量為 C g \frac{C}{g} gC​.
  • 每個組的卷積核尺寸為 N / g × C / g × K × K N/g×C/g×K×K N/g×C/g×K×K.
  • 每個組得到的輸出特征圖為 N / g × H × W N/g × H × W N/g×H×W.
  • 拼接 g 個組的輸出特征圖, 得到和标準卷積尺度一樣的輸出特征圖, 即 N × H × W N×H×W N×H×W.

特點:

1. 分組卷積可以減小卷積參數的個數, 總參數量為 g ∗ ( N × C × K × K g 2 ) = N × C × K × K g g*(\frac{N×C×K×K}{g^2}) = \frac{N×C×K×K}{g} g∗(g2N×C×K×K​)=gN×C×K×K​.

2. 分組卷積可以看成是 structured sparse, 對上圖所示的, N / g × C / g × K × K N/g×C/g×K×K N/g×C/g×K×K 卷積核可以看作 N / g × ( C − C / g ) × K × K N/g×(C-C/g)×K×K N/g×(C−C/g)×K×K 這部分卷積核的值為 0, 有時甚至可以在減少參數量的同時獲得更好的效果 (起到類似正則化的作用) .

二. Depth Separable Convolution - 深度可分離卷積

深度可分離卷積是在 mobileNet 和 Xception 中都有涉及的一個操作.

在分組卷積中, 我們考慮一種特殊情況, 如果輸入特征圖的尺寸等于輸出特征圖的尺寸 (H × W 不變) , 如果我們把輸入特征圖的通道數 C1 分成 C1個組, 也就是每個組都隻有 1 個通道, 那麼我們用 1 × 1 × K × K 的卷積核來對每組進行卷積, 同時拼接 C1 個組的結果, 得到輸出特征圖的通道仍為 C1 × H × W, 這其實就是深度可分離卷積.

對于可分離卷積, 我認為其可以分為兩種形式, 一種是空間可分離卷積, 顧名思義, 空間可分離就是将一個大的卷積核變成兩個小的卷積核, 也就是在 inception 系列中出現的把 3 × 3卷積分成對稱的 1×3 與 3×1 的操作, 另一種就是深度可分離卷積, 深度可分離卷積也可分為兩部分, 深度卷積+逐點卷積, 深度卷積就是在每個通道上執行卷積, 但是不整合所有對應通道上的結果 (沒有通道級别對應的 add 操作) ; 逐點卷積其實就是 1x1 3D 卷積, 對所有通道進行融合.

擴充卷積詳解 - 組卷積, 深度可分離卷積, 空洞卷積

圖 (a) 代表标準卷積. 假設輸入特征圖尺寸為 M ∗ H ∗ W M*H*W M∗H∗W, 卷積核尺寸為 M ∗ D k ∗ D k M*D_{k}*D_{k} M∗Dk​∗Dk​ , 共 N N N 個卷積核, 輸出特征圖尺寸為 N ∗ H ∗ W N*H*W N∗H∗W, 标準卷積層的參數量為: N ∗ M ∗ D k ∗ D k N*M*D_{k}*D_{k} N∗M∗Dk​∗Dk​.

圖 (b) 就是深度卷積, 把輸入特征圖上的每一個通道單獨執行卷積操作, 也就是用 M M M 個 1 ∗ D k ∗ D k 1*D_{k}*D_{k} 1∗Dk​∗Dk​ 的卷積核對輸入特征圖上的每一個通道執行卷積操作, 最終得到的輸出特征圖的尺寸仍然為 M ∗ H ∗ W M*H*W M∗H∗W, 參數數量為 M ∗ D k ∗ D k M*D_{k}*D_{k} M∗Dk​∗Dk​.

圖 © 為逐點卷積, 也就是正常的 1 × 1 1×1 1×1 卷積操作, 輸入特征圖為 M ∗ H ∗ W M*H*W M∗H∗W, 卷積核的尺寸為 M ∗ 1 ∗ 1 M*1*1 M∗1∗1 , 共 N N N 個卷積核, 輸出特征圖尺寸為 N ∗ H ∗ W N*H*W N∗H∗W. 參數數量為 N ∗ M N*M N∗M.

那麼圖 (b) 與圖 © 的操作結合之後就是深度可分離卷積. 深度可分離卷積的作用就是降參, 我們來對比一下标準卷積與深度可分離卷積的參數個數:

( M ∗ D k ∗ D k + N ∗ M ) N ∗ M ∗ D k ∗ D k = 1 N + 1 D k 2 \frac{ (M*D_{k}*D_{k}+N*M)}{N*M*D_{k}*D_{k}}=\frac{1}{N}+\frac{1}{D_{k}^{2}} N∗M∗Dk​∗Dk​(M∗Dk​∗Dk​+N∗M)​=N1​+Dk2​1​

如果我們用 3 ∗ 3 3*3 3∗3 的卷積, 那麼相當于我們大約可以減少 10 倍的參數計算量.

深度可分離卷積與标準卷積相比, MobileNet1 在 ImageNet 上降低了約 1% 的精度.

三. Dilated Convoluton - 擴張卷積

擴張卷積又名空洞卷積 (atrous convolutions), 通過向卷積層引入了一個稱為 "擴張率 (dilation rate) " 的參數, 該參數定義了卷積核處理資料時各值的間距.

直覺地感受一下空洞卷積的計算方式:

擴充卷積詳解 - 組卷積, 深度可分離卷積, 空洞卷積

其公式表示為:

y [ i ] = ∑ k = 0 K − 1 x [ i + r ∗ k ] ⋅ w [ k ] y[i] = \sum_{k = 0}^{K-1}x[i+r*k] \cdot w[k] y[i]=k=0∑K−1​x[i+r∗k]⋅w[k]

其中,

  • y y y 表示輸出特征圖.
  • w w w 表示卷積核的權重值.
  • K K K 表示卷積核的大小.
  • x x x 表示輸入特征圖.

換句話說, 與标準卷積相比, 擴張卷積多了一個超參數 (擴張率), 其指定了 kernel 各點之間的間隔的點數. 是以, 标準卷積的擴張率為 1.

四. 參考

[1]. 了解分組卷積與深度可分離卷積

[2]. Group Convolution組卷積

[3]. 如何了解空洞卷積 (dilated convolution)?

繼續閱讀