在这里我们都知道感受野的含义,同时也知道带孔卷积是为了在不缩小feature map 的大小的同时保持感受野大小不变,在这里我们要明确的说明感受野大小不变是怎么达到的,我们已一个3 layer 的net 来进行说明:
rate 是为了layer 能够保证原有的感受野,所以rate 的决定是由上一层的stride(stride >1 的一个作用就是增大下层的感受野)
rate的计算方式是rate *= stride,rate 的初始值为rate =1,如上图:layer 1 已经达到了output_stride的要求,接下来的layer2 feature map 大小应该保持不变,所以layer1 经过 rate=1的conv 得到layer 2,然后再通过公式计算得到layer 3 feature map 经过conv的rate,rate = rate * stride (layer 1->layer2 )=1*2=2
源代码如下:
# than the target output_stride.
current_stride = 1
# The atrous convolution rate parameter.
rate = 1
'''省略部分代码'''
if output_stride is not None and current_stride == output_stride:
net = block.unit_fn(net, rate=rate, **dict(unit, stride=1))
rate *= unit.get('stride', 1)
else:
net = block.unit_fn(net, rate=1, **unit)
current_stride *= unit.get('stride', 1)