前言
网上介绍卷积网络感受野(Receptive Field)参数计算往往都是通过代码来进行得,容易看的云里雾里。我这里通过一个例子来解释感受野参数原理以及通过公式来手算它们。
感受野参数概念
感受野参数主要有3个:
jump:就是卷积特征图上移动一个像素,反映在输入图像(源图像)上实际上移动了多少个像素。其值用j表示。
receptive field size: 即感受野大小。 它得意思是卷积特征图上一个特征(像素)对应在输入图像上有多少个像素参与乘加运算来获得。其值用r来表示源图像上有rxr个像素被感受。
start:卷积特征图上左上角第一个特征/像素 对应到源图像上得感受域的中心点坐标。计算中心点坐标时需要把padding(填充)值排除出去。假如padding为0,当感受域大小为2x2时,则start为1,而感受域3x3对应的start为1.5。
感受野参数计算公式
feature_map_size = ((image_size + 2*padding - kernel_size) / stridding_size) + 1
上面这个公式对理解卷积网络结构参数非常重要,它是 已知输入图像或卷积特征图大小,填充值p, 卷积核size以及移动步长来计算生成的特征图大小。
计算jump,receptivie size以及start坐标的公式如下:
这些公式都是迭代型。换句话讲,你不能通过上面公式随意对某个比较深的卷积层一下就求出这些值,而是只能一步一步的求,比如conv1->conv2->conv3... ... 没有求出conv1时,不可能去获得conv2的相关值。
通过例子手算感受野参数
已知某个CNN网络结构以及模板参数如上图所示,求每个卷积层的感受野参数。
该题目的一个坑是 filter的size需要通过上面第一个公式反求出来。其实是要看的懂每一卷积层的各个维度表征什么意义。
下面就一层层来分别计算它们的参数值。
conv1:
(32 + 2*0 - filter1_size)/2 + 1 = 16 反推出 filter1_size= 2
j1 = j0 * stride1 = 1*2= 2
r1 = r0+(filter1_size-1)*j0 = 1+(2-1)*1 =2
start1 = start0 + ((filter1_size-1)/2-padding1)*j0 = 0.5+ 0.5*1 = 1
conv2:
(16+2*1-k2)/1 + 1 = 8 反推 k2= 11
j2 = j1 * stride2 = 2*1 = 2
r2 = r1+(k2-1)*j1 = 2 + 10*2 = 22
start2 = start1 + ((k2-1)/2-padding2)*j1 = 1 + (5-1)*2 = 9
conv3:
(8+2*2-k3)/2 + 1 = 4 反推 k3=6
j3 =j2 * stride3 = 2*2 = 4
r3 = r2+(k3-1)*j2 = 22+5*2 = 32
start3 = start2 + ((k3-1)/2-padding3)*j2 = 9 + (2.5-2)*2 = 10