The receptive field is defined as the region in the input space that a particular CNN’s feature is looking at (i.e. be affected by).網絡
—— A guide to receptive field arithmetic for Convolutional Neural Networks架構
感覺野(Receptive Field),指的是神經網絡中神經元「看到的」輸入區域,在卷積神經網絡中,feature map上某個元素的計算受輸入圖像上某個區域的影響,這個區域即該元素的感覺野。ide
卷積神經網絡中,越深層的神經元看到的輸入區域越大,以下圖所示,kernel size 均爲\(3 \times 3\),stride均爲1,綠色標記的是\(Layer 2\) 每一個神經元看到的區域,黃色標記的是\(Layer 3\) 看到的區域,具體地,\(Layer 2\)每一個神經元可看到\(Layer 1\) 上 \(3 \times 3\) 大小的區域,\(Layer3\) 每一個神經元看到\(Layer 2\) 上 \(3 \times 3\) 大小的區域,該區域能夠又看到\(Layer 1\) 上 \(5 \times 5\) 大小的區域。ui
因此,感覺野是個相對概念,某層feature map上的元素看到前面不一樣層上的區域範圍是不一樣的,一般在不特殊指定的狀況下,感覺野指的是看到輸入圖像上的區域。spa
爲了具體計算感覺野,這裏借鑑視覺系統中的概念,
\[ receptive \ field = center + surround \].net
準確計算感覺野,須要回答兩個子問,即視野中心在哪和視野範圍多大。blog
可是,網絡架構多種多樣,每層的參數配置也不盡相同,感覺野具體該怎麼計算?ci
在正式計算以前,先對數學符號作以下約定,
\(k\):kernel size
\(p\):padding size
\(s\):stride size
\(Layer\):用\(Layer\)表示feature map,特別地 \(Layer \ 0\)爲輸入圖像;
\(Conv\):用\(Conv\)表示卷積,\(k\)、\(p\)、\(s\)爲卷積層的超參數,\(Conv \ l\)的輸入和輸出分別爲 \(Layer \ l-1\) 和 \(Layer \ l+1\);
\(n\):feature map size爲 \(n \times n\),這裏假定\(height = width\);
\(r\):receptive field size爲\(r \times r\),這裏假定感覺野爲方形;
\(j\):feature map上相鄰元素間的像素距離,即將feature map上的元素與輸入圖像\(Layer \ 0\) 上感覺野的中心對齊後,相鄰元素在輸入圖像上的像素距離,也能夠理解爲 feature map上前進1步至關於輸入圖像上前進多少個像素,以下圖所示,feature map上前進1步,至關於輸入圖像上前進2個像素,\(j=2\);
\(start\):feature map左上角元素在輸入圖像上的感覺野中心座標\((start, start)\),即視野中心的座標,在上圖中,左上角綠色塊感覺野中心座標爲\((0.5, 0.5)\),即左上角藍色塊中心的座標,左上角白色虛線塊中心的座標爲\((-0.5, -0.5)\);
\(l\):\(l\)表示層,卷積層爲\(Conv \ l\),其輸入feature map爲\(Layer \ l-1\),輸出爲\(Layer \ l\)。
下面假定全部層均爲卷積層。
感覺野大小的計算是個遞推公式。
再看上面的動圖,若是feature map $Layer 2 $ 上的一個元素\(A\)看到feature map \(Layer \ 1\) 上的範圍爲\(3 \times 3\)(圖中綠色塊),其大小等於kernel size \(k_2\),因此,\(A\)看到的感覺野範圍\(r_2\)等價於\(Layer \ 1\)上\(3 \times 3\)窗口看到的\(Layer \ 0\) 範圍,據此能夠創建起相鄰\(Layer\)感覺野的關係,以下所示,其中\(r_{l}\)爲\(Layer \ l\)的感覺野,\(r_{l-1}\)爲\(Layer \ l-1\) 的感覺野,
\[ r_{l} = r_{l-1} + (k_{l} - 1) * j_{l-1} \]
可視化以下圖所示,
下面的問題是,\(j_{in}\)怎麼求?
\(Layer \ l\) 上前進1個元素至關於\(Layer \ l-1\)上前進\(s_l\)個元素,轉換成像素單位爲
\[ j_{l} = j_{l-1} \times s_{l} \]
其中,\(s_l\)爲\(Conv \ l\)的kernel在\(Layer \ l-1\) 上滑動的步長,輸入圖像的\(s_0 = 1\)。
根據遞推公式可知,
\[ \begin{aligned}j_l &= \prod_{i=1}^{l} s_{i}\\\end{aligned} \]
\(Layer \ l\)上前進1個元素,至關於在輸入圖像前進了\(\prod_{i=1}^{l} s_{i}\)個像素,即前面全部層\(stride\)的連乘。
進一步可得,\(Layer \ l\)的感覺野大小爲
\[ \begin{aligned}r_{l} &= r_{l-1} + \left(k_{l}-1\right) * j_{l-1} \\&= r_{l-1}+\left(\left(k_{l}-1\right) * \prod_{i=1}^{l-1} s_{i}\right)\end{aligned} \]
感覺野中心的計算也是個遞推公式。
在上一節中計算得\(j_l = \prod_{i=1}^{l} s_{i}\),表示feature map \(Layer \ l\)上前進1個元素至關於在輸入圖像上前進的像素數目,若是將feature map上元素與感覺野中心對齊,則\(j_l\)爲感覺野中心之間的像素距離。以下圖所示,
其中,各層的kernel size、padding、stride超參數已在圖中標出,右側圖爲feature map和感覺野中心對齊後的結果。
相鄰\(Layer\)間,感覺野中心的關係爲
\[ start_{l} = start_{l-1} + (\frac{k_l - 1}{2} - p_l) * j_{l-1} \]
全部的\(start\)座標均相對於輸入圖像座標系。其中,\(start_0=(0.5,0.5)\),爲輸入圖像左上角像素的中心座標,\(start_{l-1}\)表示\(Layer \ l-1\)左上角元素的感覺野中心座標,\((\frac{k_l - 1}{2} - p_l)\)爲\(Layer \ l\)與\(Layer \ l-1\)感覺野中心相對於\(Layer \ l-1\)座標系的誤差,該誤差需折算到輸入圖像座標系,其值須要乘上\(j_{l-1}\),即\(Layer \ l-1\)相鄰元素間的像素距離,相乘的結果爲\((\frac{k_l - 1}{2} - p_l) * j_{l-1}\),即感覺野中心間的像素距離——相對輸入圖像座標系。至此,相鄰\(Layer\)間感覺野中心座標間的關係就不可貴出了,這個過程可視化以下。
知道了\(Layer \ l\)左上角元素的感覺野中心座標\((start_l, start_l)\),經過該層相鄰元素間的像素距離\(j_l\)能夠推算其餘元素的感覺野中心座標。
將感覺野的相關計算小結一下,
\[ \begin{aligned}j_{l} &= j_{l-1} \times s_{l} \\j_l &= \prod_{i=1}^{l} s_{i}\\r_{l} &= r_{l-1} + \left(k_{l}-1\right) * j_{l-1} \\&= r_{l-1}+\left(\left(k_{l}-1\right) * \prod_{i=1}^{l-1} s_{i}\right) \\start_{l} &= start_{l-1} + (\frac{k_l - 1}{2} - p_l) * j_{l-1}\end{aligned} \]
由上面的遞推公式,就能夠從前向後逐層計算感覺野了,代碼可參見computeReceptiveField.py,在線可視化計算可參見Receptive Field Calculator。
最後,還有幾點須要注意,
以上。