在機器視覺領域的深度神經網絡中有一個概念叫做感受野,用來表示網絡內部的不同位置的神經元對原圖像的感受范圍的大小。神經元之所以無法對原始圖像的所有信息進行感知,是因為在這些網絡結構中普遍使用卷積層和pooling層,在層與層之間均為局部相連(通過sliding filter)。神經元感受野的值越大表示其能接觸到的原始圖像范圍就越大,也意味着他可能蘊含更為全局、語義層次更高的特征;而值越小則表示其所包含的特征越趨向於局部和細節。因此感受野的值可以大致用來判斷每一層的抽象層次。
那么這個感受野要如何計算呢?我們先看下面這個例子。

可以看到在Conv1中的每一個單元所能看到的原始圖像范圍是3*3,而由於Conv2的每個單元都是由
范圍的Conv1構成,因此回溯到原始圖像,其實是能夠看到
的原始圖像范圍的。因此我們說Conv1的感受野是3,Conv2的感受野是5. 輸入圖像的每個單元的感受野被定義為1,這應該很好理解,因為每個像素只能看到自己。
通過上圖這種圖示的方式我們可以“目測”出每一層的感受野是多大,但對於層數過多、過於復雜的網絡結構來說,用這種辦法可能就不夠聰明了。因此我們希望能夠歸納出這其中的規律,並用公式來描述,這樣就可以對任意復雜的網絡結構計算其每一層的感受野了。那么我們下面看看這其中的規律為何。
由於圖像是二維的,具有空間信息,因此感受野的實質其實也是一個二維區域。但業界通常將感受野定義為一個正方形區域,因此也就使用邊長來描述其大小了。在接下來的討論中,本文也只考慮寬度一個方向。我們先按照下圖所示對輸入圖像的像素進行編號。

接下來我們使用一種並不常見的方式來展示CNN的層與層之間的關系(如下圖,請將腦袋向左倒45°觀看>_<),並且配上我們對原圖像的編號。

圖中黑色的數字所構成的層為原圖像或者是卷積層,數字表示某單元能夠看到的原始圖像像素。我們用
來表示第
個卷積層中,每個單元的感受野(即數字序列的長度);藍色的部分表示卷積操作,用
和
分別表示第
個卷積層的kernel_size和stride。
對Raw Image進行kernel_size=3, stride 2的卷積操作所得到的fmap1 (fmap為feature map的簡稱,為每一個conv層所產生的輸出)的結果是顯而易見的。序列[1 2 3]表示fmap1的第一個單元能看見原圖像中的1,2,3這三個像素,而第二個單元則能看見3,4,5。這兩個單元隨后又被kernel_size=2,stride 1的Filter 2進行卷積,因而得到的fmap2的第一個單元能夠看見原圖像中的1,2,3,4,5共5個像素(即取[1 2 3]和[3 4 5]的並集)。
接下來我們嘗試一下如何用公式來表述上述過程。可以看到,[1 2 3]和[3 4 5]之間因為Filter 1的stride 2而錯開(偏移)了兩位,而3是重疊的。對於卷積兩個感受野為3的上層單元,下一層最大能獲得的感受野為
,但因為有重疊,因此要減去(kernel_size - 1)個重疊部分,而重疊部分的計算方式則為感受野減去前面所說的偏移量,這里是2. 因此我們就得到 
繼續往下一層看,我們會發現[1 2 3 4 5]和[3 4 5 6 7]的偏移量仍為2,並不簡單地等於上一層的
,這是因為之前的stride對后續層的影響是永久性的,而且是累積相乘的關系(例如,在fmap3中,偏移量已經累積到4了),也就是說
應該這樣求

以此類推,

於是我們就可以得到關於計算感受野的抽象公式了:

經過簡單的代數變換之后,最終形式為:

轉:知乎 藍榮禕
