Depthwise Separable Convolution

Patty Wu
Jun 16, 2020

--

CNN本身的運算量極為龐大,在Google的MobileNet和Xception都有使用Depthwise Separable Convolution的技術,希望在不改變output image維度下,來降低運算量。

它將一般卷積分成兩個步驟:Depthwise convolution和Pointwise convolution。

先來看一般的CNN,假設input map維度為28*28,給定1個3*3*3的kernel進行卷積,stride=1,output map維度會是26*26*1:

如果kernel數量增加,給定3個3*3*3的kernel進行卷積,output map維度會是26*26*3:

計算量會是3*3*3*26*26*3=54756,也就是kernel長*kernel寬*input深度*output長*output寬*kernel數,這是一般的CNN。

接下來看Depthwise Separable Convolution,先上對照圖:

Depthwise Separable Convolution,顧名思義就是要將空間和深度的訊息分開提取,所以會分兩個步驟:

  1. Depthwise convolution:by各深度做卷積 (先統整空間資訊)
  2. Pointwise convolution:by各點做卷積 (再統整深度資訊)

如此降低CNN運算量。以下是Depthwise convolution圖示:

Depthwise convolution就是先by各深度做卷積,input map的深度=3,所以會有3個3*3的kernel,分別以不同顏色表示,先降低feature map面積。此時運算量=3*3*3*26*26=18252。

Pointwise convolution是by各個點做卷積,它會有1個1*1*3的kernel,by每個點去統整各個channel的訊息,深度從3化為1。

不過為了保持output map維度跟一般CNN出來相同的話,會用多用幾個kernel,這邊以3個1*1*3的kernel為例,希望output map維度是26*26*3:

此時運算量為26*26*3=2028,即output長*output寬*output channel數(也就是kernel數),就完成了。

再做一次比對:

一般CNN運算量=3*3*3*26*26*3=54756

Depthwise Separable Convolution運算=3*3*3*26*26+26*26*3=20280。

運算量大概是一般CNN的0.37倍,大大降低運算量。

參考文獻

  1. Xception: Deep Learning with Depthwise Separable Convolutions: https://arxiv.org/pdf/1610.02357.pdf
  2. 高效卷積計算結構 — Depthwise Separable Convolution: https://blog.yeshuanova.com/2018/02/depthwise-separable-convolution/
  3. 深度學習-MobileNet (Depthwise separable convolution): https://chih-sheng-huang821.medium.com/%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92-mobilenet-depthwise-separable-convolution-f1ed016b3467

--

--

No responses yet