CNN感受野计算
无痛理解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