Convolutional Neural Networks(CNN) #3 計算參數量

因為卷積神經網路(CNN)的特性,使得在使用CNN進行影像辨識時可以大幅度的降低參數量。本節介紹的主題就是計算CNN的參數量,但是在開始之前,會先用簡單的例子帶各位了解如何架構CNN,希望各位能徹底明白卷積神經網路的運作流程,藉此深入了解計算參數量的方法。

CNN(Convolutional Neural Networks)對電腦視覺領域來說可以說是非常有效,而且參數計算方式對新手來說卻是很複雜的,所以我們先用一個簡單的單層CNN說明CNN運算流程,之後再來看參數量計算與完整的CNN架構會更清楚易懂。

本系列文的程式皆以Python撰寫,並同步存放於Github:https://github.com/PoLun-Wang/DL_practice_convolutional_neural_networks

運作流程

上兩篇文章(CNN #1CNN #2)已經說明了卷積神經網路中的卷積層、池化層以及諸多功能與屬性,但都是以簡單的2D convolution來說明,而2D也僅能應用至黑白影像中,實用性不足。在此先來介紹我們最常用到的3D convolution,所謂3D就是指彩色照片中多了分別代表RGB三原色的通道(channel),因此輸入影像除了代表影像像素大小的長、寬還多了第3個維度——通道,所以3D convolution的運算比較複雜,但也會更符合實際應用狀況。

關於下圖(1)的參數說明如下:
輸入Feature map大小為$(6\times6\times3)$
卷積核大小$(3\times3\times3)$
移動步伐Stride$=1$
補充像素Padding$=0$
bias 1、bias 2皆為純量實數

圖(1)有兩個卷積核,經過這兩個卷積核計算後的結果皆為$(4\times4\times1)$的矩陣,原因是Kernel shape為$(3\times3\times3)$而channel大小就跟輸入Feature map的channel一樣,都是$3$。這讓Kernel就像個小立方體,且每一次卷積運算都會加總$27$個參數的乘積,所以依照這樣的設計會使得每一個Kernel的輸出都會是$(4\times4\times1)$。

最終,擁有$2$個Kernel 的單層CNN輸出的Feature map形狀就會變成$(4\times4\times2)$。
如此一來,各位應該產生了一個疑問,Kernel 的channel大小一定是3嗎?
答案當然不是這樣的,Kernel 的channel大小的設計原則是依據輸入Feature map的channel。

CNN 卷積神經網路 多卷積核範例圖(1):多卷積核的單層CNN運算流程

 

參數量計算

下圖(2)的Kernel由圖(1)的$2$個拓展成$k$個,除了複雜度又比上圖提高了一些之外,最主要是希望透過這張圖來說明這些變數的形狀之間的關係。先澄清一點,下圖的變數名稱不代表程式或文獻中的任何變數或記號,僅用於理解CNN運算過程的參數量計算。

表(1):圖(2)符號說明

符號 說明
上標$^{[l]}$ 表示第$l$層的變數
$a$ 代表每一層的類神經網路輸出
$k$ Kernel數量
$w$ 表示卷積核
$n$ 表示完成卷積運算的Feature map
$b$ 表示偏差值(Bias)
$n_{W}$ 完成卷積運算Feature map的寬度
$n_{H}$ 完成卷積運算Feature map的高度
$f_{W}$ 卷積核的寬度
$f_{H}$ 卷積核的高度
$f_{c}$ 卷積核的深度(Channel數)

我們可以透過圖(2)發現第$l$層的輸出$a$的形狀為$n_{H}^{[l]}\times n_{W}^{[l]}\times k^{l}$,其中$n_{H}^{[l]}$、$n_{W}^{[l]}$的大小正好跟完成卷積運算的Feature map$^{[l]}$一致,而深度($k^{[l]}$)就等於卷積核數量。而第$l$層需要訓練的參數量包括卷積核(Kernel)以及偏差(Bias),Kernel的參數量計算方法很簡單就是$f_{H}^{[l]}\times f_{W}^{[l]}\times f_{c}^{[l]}\times k$Bias則是$k$個參數,因為每$1$個卷積核的結果需要再加上$1$個Bias。

所以,一層卷積層需訓練的參數量就會是$f_{H}^{[l]}\times f_{W}^{[l]}\times f_{c}^{[l]}\times k+k$個參數。

CNN 卷積神經網路 計算參數量, calculate the number of parameters in CNN.
圖(2):多層CNN之變數相對關係

 

舉例:如果你有個10個$3\times3\times3$卷積核的卷積層,不考慮其他因素下,這一層會產生多少參數呢?

Ans:答案就是$(3\times3\times3+1)\times10=280$(記得要算Bias喔!)

 

Reference
  1. Andrew Ng – Convolution Neural Networks in Coursera
  2. (paper) A guide to convolution arithmetic for deep learning

Andy Wang

站在巨人的肩膀上仍須戰戰兢兢!

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料