完全搞懂感覺野的含義與計算

博客:博客園 | CSDN | bloggithub

什麼是感覺野

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

https://www.researchgate.net/publication/316950618_Maritime_Semantic_Labeling_of_Optical_Remote_Sens

因此,感覺野是個相對概念,某層feature map上的元素看到前面不一樣層上的區域範圍是不一樣的,一般在不特殊指定的狀況下,感覺野指的是看到輸入圖像上的區域。spa

爲了具體計算感覺野,這裏借鑑視覺系統中的概念,
\[ receptive \ field = center + surround \].net

準確計算感覺野,須要回答兩個子問,即視野中心在哪和視野範圍多大blog

  • 只有看到」合適範圍的信息」纔可能作出正確的判斷,不然就可能「盲人摸象」或者「一覽衆山小」;
  • 目標識別問題中,咱們須要知道神經元看到是哪一個區域,才能合理推斷物體在哪以及判斷是什麼物體。

可是,網絡架構多種多樣,每層的參數配置也不盡相同,感覺野具體該怎麼計算?ci

約定

在正式計算以前,先對數學符號作以下約定,

https://medium.com/mlreview/a-guide-to-receptive-field-arithmetic-for-convolutional-neural-networks-e0f514068807

  • \(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\)

    https://github.com/vdumoulin/conv_arithmetic/blob/master/gif/padding_strides.gif

  • \(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} \]

  • \(Layer \ l\) 一個元素的感覺野\(r_{l}\)等價於\(Layer \ l-1\)\(k \times k\) 個感覺野的疊加;
  • \(Layer \ l-1\) 上一個元素的感覺野爲\(r_{l-1}\)
  • \(Layer \ l-1\) 上連續\(k\) 個元素的感覺野能夠當作是,第1個元素看到的感覺野加上剩餘\(k-1\)步掃過的範圍\(Layer \ l-1\) 上每前進1個元素至關於在輸入圖像上前進\(j_{l-1}\)個像素,結果等於\(r_{l-1} + (k - 1) \times j_{l-1}\)

可視化以下圖所示,

receptive field size

下面的問題是,\(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\)爲感覺野中心之間的像素距離。以下圖所示,

receptive field center

其中,各層的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\)間感覺野中心座標間的關係就不可貴出了,這個過程可視化以下。

receptive field center calculation

知道了\(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

最後,還有幾點須要注意,

  • \(Layer \ l\)的感覺野大小與\(s_l\)\(p_l\)無關,即當前feature map元素的感覺野大小與該層相鄰元素間的像素距離無關;
  • 爲了簡化,一般將padding size設置爲kernel的半徑,即\(p = \frac{k-1}{2}\),可得\(start_l = start_{l-1}\),使得feature map \(Layer \ l\)\((x, y)\)位置的元素,其感覺野中心座標爲\((x j_l, y j_l)\)
  • 對於空洞卷積dilated convolution,至關於改變了卷積核的尺寸,若含有\(dilation\ rate\)參數,只需將\(k_l\)替換爲\(dilation \ rate * (k_l - 1) + 1\)\(dilation\ rate=1\)時爲正常卷積;
  • 對於pooling層,可將其當成特殊的卷積層,一樣存在kernel size、padding、stride參數;
  • 非線性激活層爲逐元素操做,不改變感覺野。

以上。

參考

相關文章
相關標籤/搜索