無痛理解CNN中的感受野receptive field
CNN中感受野的計算
從直觀上講,感受野就是視覺感受區域的大小。在卷積神經網絡中,感受野的定義是決定某一層輸出結果中一個元素所對應的輸入層的區域大小
感受野計算時有下面的幾個情況需要說明:
a)第一層卷積層的輸出特征圖像素的感受野的大小等於濾波器的大小;
b)深層卷積層的感受野大小和它之前所有層的濾波器大小和步長有關系;
c)計算感受野大小時,忽略了圖像邊緣的影響,即不考慮padding的大小。
至於如何計算感受野,我的建議是top to down的方式,即從網絡的最后向前推
感受野的大小是由kernel size(filter)和stride size(步長)一起決定的,公式:
rfsize = f(out, stride, ksize) = (out - 1) * stride + ksize,其中out是指上一層感受野的大小,stride是當前層stride
最后一層不帶入公式,它的ksize是前一層的out
理解:
Feature Map的尺寸=(input_size + 2 * padding_size − ksize)/stride+1
根據定義 感受野是決定某一層輸出結果中一個元素所對應的輸入層的區域大小
這里指的是要求解的那層的一個元素也就是最初輸入的out=1:
rfsize = f(out, stride, ksize) = (out - 1) * stride + ksize
感受野近似於用feature map反推input_size ,只是不考慮padding
例1:
以VGG16為例:
vgg16構造模型圖:http://ethereon.github.io/netscope/#/gist/dc5003de6943ea5a6b8b
一個元素,所以out=1
pool2: rfsize= (1-1)*2+2=2
conv1_2: rfsize=(2-1)*1+3=4
conv1_1: rfsize= (4-1)*1+3=6
例2:
r指感受野 s:stride,p:padding,k:filter
layer1對layer0:
out=1
(1-1)*2+3=3
layer2對layer0:
out=1
(1-1)*2+3=3
(3-1)*2+3=7