從卷積拆分和分組的角度看CNN模型的演化

博客:博客園 | CSDN | blog網絡

寫在前面

如題,這篇文章將嘗試從卷積拆分的角度看一看各類經典CNN backbone網絡module是如何演進的,爲了視角的統一,僅分析單條路徑上的卷積形式。ide

形式化

方便起見,對常規卷積操做,作以下定義,模塊化

  • \(I\):輸入尺寸,長\(H\)\(W\) ,令長寬相同,即\(I = H = W\)
  • \(M\):輸入channel數,能夠當作是tensor的高
  • \(K\):卷積核尺寸\(K \times K\),channel數與輸入channel數相同,爲\(M\)
  • \(N\):卷積核個數
  • \(F\):卷積獲得的feature map尺寸\(F \times F\),channel數與卷積核個數相同,爲\(N\)

因此,輸入爲\(M \times I \times I\)的tensor,卷積核爲\(N \times M \times K \times K\)的tensor,feature map爲\(N \times F \times F\)的tensor,因此常規卷積的計算量爲函數

\[FLOPS = K \times K \times M \times N \times F \times F \]

特別地,若是僅考慮SAME padding且\(stride = 1\)的狀況,則\(F = I\),則計算量等價爲性能

\[FLOPS = K \times K \times M \times N \times I \times I \]

能夠當作是\((K \times K \times M) \times (N \times I \times I)\),前一個括號爲卷積中一次內積運算的計算量,後一個括號爲須要多少次內積運算。spa

參數量爲.net

\[\#Params = N \times M \times K \times K \]

網絡演化

總覽SqueezeNet、MobileNet V1 V二、ShuffleNet等各類輕量化網絡,能夠當作對卷積核\(M \times K \times K\) 進行了各類拆分或分組(同時引入激活函數),這些拆分和分組一般會減小參數量和計算量,這就爲進一步增長卷積核數量\(N\)讓出了空間,同時這種結構上的變化也是一種正則,經過上述變化來得到性能和計算量之間的平衡。blog

這些變化,從總體上看,至關於對原始\(FLOPS = K \times K \times M \times N \times I \times I\)作了各類變換。backbone

下面就從這個視角進行一下疏理,簡潔起見,只列出其中發生改變的因子項,get

  • Group Convolution(AlexNet),對輸入進行分組,卷積核數量不變,但channel數減小,至關於

    \[M \rightarrow \frac{M}{G} \]

    Convolution VS Group Convolution

  • 大卷積核替換爲多個堆疊的小核(VGG),好比\(5\times 5\)替換爲2個\(3\times 3\)\(7\times 7\)替換爲3個\(3\times 3\),保持感覺野不變的同時,減小參數量和計算量,至關於把 大數乘積 變成 小數乘積之和,

    \[(K \times K) \rightarrow (k \times k + \dots + k \times k) \]

    https://discuss.pytorch.org/t/dynamic-structure-of-cnn/45870/2

  • Factorized Convolution(Inception V2),二維卷積變爲行列分別卷積,先行卷積再列卷積,

    \[(K \times K) \rightarrow (K \times 1 + 1 \times K) \]

    source: http://arxiv.org/abs/1512.00567

  • Fire module(SqueezeNet),pointwise+ReLU+(pointwise + 3x3 conv)+ReLU,pointwise降維,同時將必定比例的\(3\times 3\)卷積替換爲爲\(1 \times 1\)

    \[(K \times K \times M \times N) \rightarrow (M \times \frac{N}{t} + \frac{N}{t} \times (1-p)N + K \times K \times \frac{N}{t} \times pN) \\ K = 3 \]

    https://arxiv.org/abs/1602.07360

  • Bottleneck(ResNet)pointwise+BN ReLU+3x3 conv+BN ReLU+pointwise,相似於對channel維作SVD,

    \[(K \times K \times M \times N) \rightarrow (M \times \frac{N}{t} + K \times K \times \frac{N}{t} \times \frac{N}{t} + \frac{N}{t} \times N) \\ t = 4 \]

    https://arxiv.org/abs/1512.03385

  • ResNeXt Block(ResNeXt),至關於引入了group \(3\times 3\) convolution的bottleneck,

    \[(K \times K \times M \times N) \rightarrow (M \times \frac{N}{t} + K \times K \times \frac{N}{tG} \times \frac{N}{t} + \frac{N}{t} \times N) \\t = 2, \ G = 32 \]

    https://arxiv.org/abs/1611.05431

  • Depthwise Separable Convolution(MobileNet V1)depthwise +BN ReLU + pointwise + BN ReLU,至關於將channel維單獨分解出去,

    \[(K \times K \times N) \rightarrow (K \times K + N) \]

    https://mc.ai/review-xception-with-depthwise-separable-convolution-better-than-inception-v3-image/

  • Separable Convolution(Xception)pointwise + depthwise + BN ReLU,也至關於將channel維分解出去,但先後順序不一樣(但由於是連續堆疊,其實跟基本Depthwise Separable Convolution等價),同時移除了二者間的ReLU,

    \[(K \times K \times M) \rightarrow (M + K \times K) \]

    但實際在實現時仍是depthwise + pointwise + ReLU。。。

    https://mc.ai/review-xception-with-depthwise-separable-convolution-better-than-inception-v3-image/

  • pointwise group convolution and channel shuffle(ShuffleNet)group pointwise+BN ReLU+Channel Shuffle+depthwise+BN+group pointwise+BN,至關於bottleneck中2個pointwise引入相同的group,同時\(3\times 3\) conv變成depthwise,也就是說3個卷積層都group了,這會阻礙不一樣channel間(分組間)的信息交流,因此在第一個group pointwise後加入了channel shuffle,即

    \[(K \times K \times M \times N) \rightarrow (\frac{M}{G} \times \frac{N}{t} + channel \ shuffle +K \times K \times \frac{N}{t} + \frac{N}{tG} \times N) \]

    https://arxiv.org/abs/1707.01083

  • Inverted Linear Bottleneck(MobileNet V2),bottleneck是先經過pointwise降維、再卷積、再升維,Inverted bottleneck是先升維、再卷積、再降維,pointwise+BN ReLU6+depthwise+BN ReLU6+pointwise+BN

    \[(K \times K \times M \times N) \rightarrow (M \times tM + K \times K \times tM + tM \times N) \\t = 6 \]

    https://arxiv.org/abs/1801.04381

小結

最後小結一下,早期的CNN由一個個常規卷積層堆疊而成,然後,開始模塊化,由一個個 module構成,module的演化,能夠當作是不停地在常規卷積的計算量\(FLOPS = K \times K \times M \times N \times I \times I\)上作文章。

  • 拆分:卷積核是個3 D 的tensor,能夠在不一樣維度上進行拆分,行列可拆分,高也可拆分,還能夠拆分紅多段串聯(相似SVD)。
  • 分組:若是多個卷積核放在一塊兒,能夠構成4D的tensor,增長的這一數量維上能夠分組group。

不一樣拆分和分組的方式排列組合就構成了各類各樣的module。

相關文章
相關標籤/搜索