感受野(receptive field)
CNN中,某一层输出结果中一个元素所对应的输入层的区域大小.
感受野计算
从后往前
output field size = ( input field size - kernel size + 2 × padding ) / stride + 1,变形之后得到input field size = (output field size - 1)× stride - 2 × padding + kernel size。因此可以通过后式从最后一层到第一次级联后计算在原图上的感受野。计算感受野时不需要考虑padding(因为我们不是在计算具体有边界的映射区域,而是计算抽象的大小):
RF = 1 #待计算的feature map上的感受野大小
for layer in (top layer To down layer):
RF = ((RF -1)* stride) + kernel size
从前往后[1]
\(l_k\) 是第k层的每个点的感受野, \(f_k\)是第k层卷积核的大小(宽或高, 并假设宽高相等), \(s_i\)是第i层卷积的stride, 在第k层的感受野比第k-1层的感受野大 \((f_k−1)\times S_{k−1}=(f_k - 1) \times \prod_{i=1}^{k-1}s_i\).
孔洞卷积
下面考虑计算带孔卷积(dialated conv)的感受野的理论值(实际上将孔洞也算进感受区域了,如果计算非孔位置的面积那就和不带孔洞的感受野的值相等了)。
卷积核的dialate
属性定义为卷积核的元素间距,如 dialate=2 是每隔一个像素位置应用一个卷积元素,dialate=1就是普通的无孔卷积。那么大小\(f_k\),dialate=d的卷积核的等价卷积作用大小为:\(f_k'=(f_k-1)d+1\).
然后用\(f_k'\)代替\(f_k\),采用上述的两种计算方式计算感受野.
举例
例子:
如果有三层CNN,分别为con3x3, dilation=1, conv3x3, dialation=2, conv3x3, dilation=5,它们的stried=1,则最后一层每个神经元的感受野为17x17.