卷积神经网络之如何使用【公式】计算感受野 receptive field?

感受野可以说卷积神经网络中比较重要的一个知识点了,对于理解神经网络的原理应该是有重要作用的。

本文旨在说明如何计算感受野

基本知识

1. 普通神经网络基本构成:卷积核大小,步长,padding
2. 计算输出特征图大小:看下面的第二幅图里面的公式

我相信大家看到本篇博客的时候,应该已经知道了什么是卷积神经网络。对于不知道卷积神经网络的,建议去看CS231n的网络课程,里面非常详细。考虑到卷积神经网络目前已经发展到了很多种,我们这里先说明一下,我们考虑什么卷积神经网络。本博客主要涉及普通的卷积神经网络,和池化操作,也就是所谓的convolutional layer和pooling layer。相对应的主要指标有步长stride,卷积核大小或者池化层大小。以及padding操作。
下图说明了本文主要的讨论的对象,其中我们讨论红色的两个部分,对于另外的两个dilated and deformable convolution 我们不做讨论。
卷积神经网络之如何使用【公式】计算感受野 receptive field?
看到这里的同学,我也相信大家知道
根据特定的输入和卷积核操作来计算输入特征图的大小
。这里也直接给出公式,如下图。如果不了解的,还是一样的,去看CS213n的课程。
卷积神经网络之如何使用【公式】计算感受野 receptive field?

基本观点1:计算感受野时,padding的作用可以先忽略

我们知道padding的作用在于保持特征图的大小,通常会对外围的像素或者特征起作用,而对中间的像素或特征没有影响。
因此我们在计算感受野时可以先不用考虑padding的作用。当且仅当我们考虑边缘像素的感受野时才需要考虑padding的作用。
为了简化我们的理解,我们这里只选择没有padding的进行解释和计算,也就是说选择(最)中间的特征进行计算感受野。

基本观点2:感受野的计算和计算特征图的输出大小是相反的运算

首先,我们先要明白什么是感受野
感受野是指,在神经网络运算过程中产生的某一层且某特定位置的特征与原始图像的哪些像素有直接的关系
这里给一个简单的例子以便大家理解,以ZFnet (论文名称:Visualizing and Understanding convolutional networks)的运算过程为例子。比如我们的输入是一个224*224大小的图片,我们要求第三层特征图中某一个位置的特征与原始输入图像哪些位置的像素相关。

现在,我们的问题是假如不使用padding,原始图像需要什么尺寸才能有效生成一个我们要求的某层特征。举例来说,就是我们输入图像最小是多少,才能在我们要求的那一层输出一个特征。可以理解的是,假如我们输入的图像太小,那么必然执行到某一层我们无法进行有意义的计算。最极端的例子,我们的输入就是一个像素,而ZFnet的第一层就是用7*7的卷积进行计算,在这样的输入下我们是无法计算的。

我们可以知道,在这样的情况下,我们利用下述公式来计算输出的size或者反向计算输入的size。还有一个不同的是,反向计算感受野时,我们是一直计算到原始输入的图像上,而计算特征图大小只需要根据某一层的情况来计算。
卷积神经网络之如何使用【公式】计算感受野 receptive field?
也就是说,我们重复使用下述公式就可以计算感受野了。注意要重复使用,从后往前使用
卷积神经网络之如何使用【公式】计算感受野 receptive field?

以ZFnet的计算为例子

ZFnet:论文题目Visualizing and Understanding convolutional networks

各种操作及其size 步长 感受野大小
conv 7 2 171
max pool 3 2 83
conv 5 2 41
max pool 3 2 19
conv 3 1 9
conv 3 1 7
conv 3 1 5
max pool 3 2 3
输出层 1

这里我们来说明如何从最后一个计算到最初的感受野的。

先从最后一层计算,这时我们的输出是一个特征,output size 为1,上一层的max pool 的size为3,步长为2,我们带入公式可以得到Inputsize=(outputsize1)stride+filtersize=(11)2+3=3Input size = (output size -1) * stride +filter size = (1- 1)*2+3=3

然后计算再上一层,这时我们的输出是3和3,那么问题就变成了,如果我们希望输出是3和3,那么它的输入应该是多少呢?Inputsize=(outputsize1)stride+filtersize=(31)1+3=5Input size = (output size -1) * stride +filter size = (3- 1)*1+3=5
再上一层,也就是倒数第三层,这时我们希望输出是5和5,Inputsize=(outputsize1)stride+filtersize=(51)1+3=7Input size = (output size -1) * stride +filter size = (5- 1)*1+3=7
再上一层,也就是倒数第四层,顺数第五层,这时我们希望输出是7和7,Inputsize=(outputsize1)stride+filtersize=(71)1+3=9Input size = (output size -1) * stride +filter size = (7- 1)*1+3=9
第四层,以下简化:Inputsize=(outputsize1)stride+filtersize=(91)2+3=16+3=19Input size = (output size -1) * stride +filter size = (9- 1)*2+3=16+3=19
第三层:Inputsize=(outputsize1)stride+filtersize=(191)2+3=182+5=36+5=41Input size = (output size -1) * stride +filter size = (19- 1)*2+3=18*2+5=36+5=41
第二层:Inputsize=(outputsize1)stride+filtersize=(411)2+3=80+3=83Input size = (output size -1) * stride +filter size = (41- 1)*2+3=80+3=83
第一层:Inputsize=(outputsize1)stride+filtersize=(831)2+7=164+7=171Input size = (output size -1) * stride +filter size = (83- 1)*2+7=164+7=171

相信到这里大家应该已经知道怎么计算了。最后,我们验证一下我们和别人做的是否相同,实际上,国外已经有人将这个做成了网页,你只要输入各种操作就行了。
自动计算感受野的网址
按照ZFnet来设置,我们可以得到最后一层的感受野是171,和我们计算的是一样的。其他各层我们可以自己练习一下了。祝你好运。
卷积神经网络之如何使用【公式】计算感受野 receptive field?

为何要点赞?

如果本文解决了你的困惑,不妨点个赞鼓励一下。
不管你信不信,也不管你同不同意,实际上,你的每一次点赞都标志着你自身的进步。而打赏乃是点赞的高级形式
曾经有无数个点赞的机会,但是我都没有好好珍惜,假如时光可以倒流,我一定为他们也为自己点赞。