先來看一般的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,顧名思義就是要將空間和深度的訊息分開提取,所以會分兩個步驟:
- Depthwise convolution:by各深度做卷積 (先統整空間資訊)
- 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倍,大大降低運算量。
參考文獻
- Xception: Deep Learning with Depthwise Separable Convolutions: https://arxiv.org/pdf/1610.02357.pdf
- 高效卷積計算結構 — Depthwise Separable Convolution: https://blog.yeshuanova.com/2018/02/depthwise-separable-convolution/
- 深度學習-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