神经网络第一篇——感受野的学习、计算与思考

感受野是什么?

绪论

图像的空间联系是局部的,就像人是通过一个局部的感受野去感受外界图像一样,每一个神经元都不需要对全局图像做感受。每个神经元只感受局部的图像区域,然后在更高层,将这些感受不同局部的神经元综合起来就可以得到全局信息。同理,Deep CNN中的一个基本概念是网络中某一层单元的感受野。 在全连接网络中,每个单元的值取决于网络的整个输入;而在卷积网络中,一个单元仅取决于输入的一个区域, 输入中的该区域就是该单元的感受野(receptive field)

神经元感受野之外的图像内容并不会对该神经元的值产生影响。所以,必须确保这个神经元的感受野覆盖所有相关的图像区域。在工程应用中,可以通过调节网络的深度、卷积的kernel size等参数来控制网络的感受野大小 。例如:在语义图像分割、立体视觉和光流估计等密集预测任务中,对输入图像中的每个像素进行预测时,每个输出像素都必须有一个足够大的感受野,这样在进行预测时才不会遗漏重要的信息。

感受野是卷积神经网络里面最重要的概念之一,目前流行的物体识别方法都是围绕感受野来做的设计,例如:SSD和Faster RCNN框架中关于prior box和Anchor box的设计。因此,理解好感受野的本质有两个优势:(1)理解卷积的本质;(2)更好的理解CNN的整个架构。

另一方面,由于现在CNN深度学习越来越深。为了压缩计算量,越到后面的层数往往feature size越来越小。但是,参与“决策”往往是在最后几层网络(FPN除外),因此,如何保证小的网络仍然具有全局性是构建CNN网络的一个重要依据。 RF便是一个考量feature map中每个神经元具有多少全局性的指标

一、理论感受野——Reception Field(RF)

基本定义:

感受野(Reception field,简称RF) 用来表示网络内部的不同神经元对原始图像的感受范围的大小。或者说,卷积神经网络convNets(cnn)每一层输出的特征图(feature map)上的单个像素点在原始图像上映射的区域大小。(备注:这里的原始图像是指网络的 输入图像 ,是经过 预处理(如resize,warp,crop)后的图像,并不是原图。)

其他关于感受野定义的一些说法:(帮助大家理解“感受野”的概念)

  • The reception field is defined as the region in the input space that a
    particular CNN’s feature is looking at(i.e. be affected). ——Dang Ha
    The Hien

  • 在机器视觉领域的深度神经网络中有一个概念叫做感受野,用来表示网络内部的不同位置的神经元对原始图像的感受范围的大小。——蓝荣祎

  • 形象的说,就是你的曾曾曾曾曾爷爷对他的后代们有多少影响这么一个概念。所以影响大不一定好,也许会带来用不着的糟粕;影响小也会阻碍后代学习传统知识。——摘自《如何计算感受野(Receptive Field)——原理

  • 感受野,指的是神经网络中神经元“看到的”输入区域。更通俗讲,就是在卷积神经网络中,某一层的feature map上的一个点对应输入图上的区域。

  • 感受野是在输入空间内,CNN提取的特征的来源区域的大小。 即:一个特定的 CNN 特征(特征图上的某个点)在输入空间所受影响的区域。

基本特征:

1、输出特征会受感受野区域内的像素点的影响
2、神经元感受野之外的图像内容并不会对该神经元的值产生影响

神经元之所以 无法对原始图像的所有信息进行感知,是因为在这些网络结构中普遍使用卷积层和pooling层,在层与层之间均为局部连接(通过sliding filter)

3、感受野的值可以用来大致判断每一层的抽象层次

基本规律:
神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节。

4、感受野可以用其中心位置和尺寸来描述

基本规律:
在一个感受野内,越靠近中心位置的像素对CNN特征的贡献越多(详见:有效感受野部分)。这说明CNN特征不仅具有感受野,而且在感受野内部还会根据距离施加权重。

5、可以通过不同的方法来增大感受野,例如:堆叠更多层(depth),降采样(pooling,striding),滤波器膨胀(dilated convolutions)等。

基本规律:
理论上,堆叠更多层会使感受野线性增大,因为每个额外层的感受野会增加内核大小。 但实际上并不是这么简单。另一方面,二次抽样会成倍地增加感受野的大小。 像VGG网络和残差网络这样的现代Deep CNN体系结构使用这些技术的组合。
\quad
输入层每个单元的感受野是1,层次越深,感受野越大。一般而言,感受野是由kernel size和stride size共同决定的,一个特征图的所有特征都有相同大小的感受野,特征被标记在其感受野所在的中心(也就是每个像素)。而对于深度CNN,我们无法直接追踪到感受野信息。

原文摘录:
The receptive field is defined as the region in the input space that a particular CNN’s feature is looking at (i.e. be affected by). A receptive field of a feature can be described by its center location and its size. (Edit later) However, not all pixels in a receptive field is equally important to its corresponding CNN’s feature. Within a receptive field, the closer a pixel to the center of the field, the more it contributes to the calculation of the output feature. Which means that a feature does not only look at a particular region (i.e. its receptive field) in the input image, but also focus exponentially more to the middle of that region. This important insight will be explained further in another blog post. For now, we focus on calculating the location and size of a particular receptive field.

感受野在辅助网络的设计中的作用

  • 一般任务:要求感受野越大越好,如:图像分类中最后卷积层的感受野要大于输入图像,且网络深度越深,感受野越大,性能越好;
  • 目标检测:设置 anchor 要严格对应感受野,anchor 太大或偏离感受野都会严重影响检测性能;
  • 语义分割:要求输出像素的感受野足够的大,以确保做出决策时没有忽略重要信息,一般也是越深越好;
  • 多个小卷积代替一个大卷积层,在加深网络深度(增强了网络容量和复杂度)的同时减少参数的个数。 例如: 3 × 3 3 × 3 3×3的小卷积核通过多层叠加可取得与 7 × 7 7 × 7 7×7的大卷积核同等规模的感受野。
  • 在修改现成的网络时,感受野也可以对网络的设计提供一些思路。例如:(1)在不增加参数的前提下,可以考虑使用扩张卷积(Dilation conv);(2)为了增大浅层特征的感受野,可以考虑使用FPN。

二、有效感受野——Effective Receptive Field(ERF)

对于一个CNN特征来说,感受野特征图中的每个像素值并不是同等重要。一个像素点越接近感受野中心,它对输出特征的计算所起作用越大,这意味着 某一个特征不仅仅是受限在输入图片某个特定的区域,而且呈指数级聚焦在区域的中心。 该聚焦区域即为“有效感受野”。

有效感受野占理论感受野很小的一部分,也就是说在层层卷积以及非线性计算过程中,有效感受野很难与离中心很远处的目标位置产生联系,即:更多的保留了局部信息。所以,这也是为什么我们在做目标检测和分割以及一些识别任务时,需要考虑如何给网络加入上、下文信息。从这里看,还是为了增大有效感受野。

另一方面,当你的网络结构确定之后,理论感受野也就是个定值了。 那天天的调参数、训模型,到底是为了达到什么效果? 其中很重要的一点就是 得到比较好的有效感受野(effective receptive field,ERF)

有效感受野的直观特征:

  1. 有效感受野比理论感受野小;
  2. 有效感受野的上限是输入图像大小;
  3. 初始化的模型,有效感受野很小。

有效感受野的可视化:

在下图中,可以看到左侧是输入像素,使用3×3卷积滤波器从输入像素计算出一个特征映射,最后再进行3×3滤波后得到输出。 左侧 图像中像素内的数字表示该像素作为卷积步骤(滤波器的每个滑动步骤)的一部分的次数。 我们可以看到:位于中心的感受野的像素可以通过许多不同的路径将信息传递给输出,而边缘的一些像素只能通过单一的路径传播卷积核在该像素上运算的次数),所以,ERF对最终输出计算的影响看起来更像是一个高斯分布而非均一分布。

在这里插入图片描述

我们以下图为例,简要介绍有效感受野的问题:

在这里插入图片描述

在这里插入图片描述

有效感受野的定性分析:

在论文《Understanding the Effective Receptive Field in Deep Convolutional Neural Networks》中,作者使用多种不同的架构、激活函数等来进行有效感受野的可视化实验。最后,得到关于“有效感受野”的一些定性分析结论如下:

  1. 有效感受野区域是类高斯分布而非均一分布。如下图所示,位于感受野中心的像素对输出的影响要比边缘的像素大得多。
    在这里插入图片描述

摘自论文原文:
\quad
ERFs are Gaussian distributed: As shown in Fig. 1, we can observe perfect Gaussian shapes for uniformly(均匀) and randomly(随机) weighted convolution kernels without nonlinear activations, and near Gaussian shapes for randomly weighted kernels with nonlinearity. (译文:对于没有非线性激活的均匀和随机加权卷积核,我们可以观察到理想的高斯形状,而对于具有非线性的随机加权核,则可以观察到接近高斯形状。)Adding the ReLU nonlinearity makes the distribution a bit less Gaussian, as the ERF distribution depends on the input as well. (译文:添加ReLU非线性会使得高斯分布特征降低,因为ERF分布也取决于输入。)Another reason is that ReLU units output exactly zero for half of its inputs and it is very easy to get a zero output for the center pixel on the output plane, which means no path from the receptive field can reach the output, hence the gradient is all zero. (译文:另一个原因是ReLU单元的一半输入正好输出零,并且很容易在输出平面上的中心像素得到零输出,这意味着没有来自感受野的路径可以到达输出,因此梯度是全部为零。)Here the ERFs are averaged over 20 runs with different random seed. The figures on the right shows the ERF for networks with 20 layers of random weights, with different nonlinearities. Here the results are averaged both across 100 runs with different random weights as well as different random inputs. In this setting the receptive fields are a lot more Gaussian-like.

  1. 随着网络加深,理论感受野 n \sqrt{n} n 倍增长,而有效感受野占理论感受野的比例 1 n \frac{1}{\sqrt{n}} n 1倍衰减,其实也就是说有效感受野的真实大小没怎么变(备注:随着网络的加深,有效感受野也逐步变大,只是相对而言增长很小而已)。如图2;
    在这里插入图片描述

摘自论文原文:
\quad
n \sqrt{n} n 绝对增长(absolute growth) and 1 / n 1/\sqrt{n} 1/n 相对收缩(relative shrinkage): In Fig. 2, we show the change of ERF size and the relative ratio of ERF over theoretical RF w.r.t number of convolution layers. The best fitting line for ERF size gives slope of 0.56 in log domain, while the line for ERF ratio gives slope of -0.43.
\quad
This indicates ERF size is growing linearly w.r.t N \sqrt{N} N and ERF ratio is shrinking linearly w.r.t. 1 / N 1/\sqrt{N} 1/N .
\quad
Note N here we use 2 standard deviations(标准差) as our measurement for ERF size, i.e. any pixel with value greater than 1 − 95.45% of center point is considered as in ERF. The ERF size is represented by the square root(平方根) of number of pixels within ERF, while the theoretical RF size is the side length of the square in which all pixel has a non-zero impact on the output pixel, no matter how small. All experiments here are averaged over 20 runs.

  1. 下采样(Subsample)和扩张卷积(Dialtion convolution)会提高有效感受野,如图3;

在这里插入图片描述

摘自论文原文:
\quad
Subsampling & dilated convolution increases receptive field: The figure on the right shows the effect of subsampling and dilated convolution.
\quad
The reference baseline is a convnet with 15 dense convolution layers. Its ERF is shown in the left-most figure. We then replace 3 of the 15 convolutional layers with stride-2 convolution to get the ERF for the ‘Subsample’ figure, and replace them with dilated convolution with factor 2,4 and 8 for the ‘Dilation’ figure. As we see, both of them are able to increase the effect receptive field signif- icantly. Note the ‘Dilation’ figure shows a rectangular ERF shape typical for dilated convolutions.(译文:参考基线是具有15个密集卷积层的卷积。 其ERF显示在最左图。 然后,我们将15个卷积层中的3个替换为stride-2卷积,以得到“子样本”图的ERF,并用散度卷积将它们替换为“ Dilation”图的因子2,4和8。 如我们所见,它们两者都能够显着提高有效感受野。 请注意,“膨胀”图显示了矩形ERF形状,通常用于膨胀卷积。)

  1. 训练会提高有效感受野范围,即:随着网络的学习,ERF变大,并且在训练结束时,ERF明显大于初始ERF。如图4;

在这里插入图片描述

How the ERF evolves during training???
In this part, we take a look at how the ERF of units in the top-most convolutional layers of a classification CNN and a semantic segmentation CNN evolve during training. For both tasks, we adopt the ResNet architecture which makes extensive use of skip-connections. As the analysis shows, the ERF of this network should be significantly smaller than the theoretical receptive field. This is indeed what we have observed initially. Intriguingly, as the networks learns, the ERF gets bigger, and at the end of training is significantly larger than the initial ERF. (译文:有趣的是,随着网络的学习,ERF变得更大,并且在训练结束时,ERF明显大于初始ERF)
\quad
小结:
\quad
有效感受野的大小是动态变化的,与边界像素相比,在反向传播过程中,中心像素将具有更大的梯度幅度。并且,在训练之后它被大幅度地增加,这意味着,在训练开始时可以使用更好的初始化方案来增加感受野。

  1. 合理的权重初始化,可以提高感受野和加速收敛。具体方法如下:

Practically, we can initialize the network with any initialization method, then scale the weights according to a distribution that has a lower scale at the center and higher scale on the outside[1]。
\quad
现在的CNN网络都比较深,输出层有足够大的理论感受野,有能力表达出不同尺度的目标。但是真正对目标起作用的是有效感受野,而有效感受野是远小于理论感受野的,所以大部分的目标检测网络,其实只是看到了目标的一小部分,然后去预测整个目标大小。但是,实验也证明,在网络训练过程中,实际感受野也增大,所以好的网络设计、训练参数会增大有效感受野,对达成任务目标很有帮助。

  1. 使用非矩形窗口的卷积,如deformable convolution。

有效感受野的定量分析:

有效感受野和网络结构、网络参数都是相关的,因此只有当网络训练好的时候才便于分析感受野情况。

这里 介绍一种简单的用于分析有效感受野范围的数据驱动的方法。步骤如下:

  1. 确定待分析的对象,以及该对象在卷积神经网络的每一层对应的激活区域,即:输入图像中的对象在所有网络层的特征图;
  2. 明确该对象的哪些区域对特征图的激活区域影响较大:具体操作就是在该对象的图像区域中,随机掩盖某些小区域,如:对 11 × 11 11×11 11×11的范围置 0 0 0,从而我们得到 n n n 张带有一个被掩盖小区域的图像;
  3. n n n张图像以及原图送入网络中计算得到每层的特征图,对比有掩盖区域的图像与原始图像在激活区域激活分值的变化,如果激活分值差异明显的,就说明掩盖的区域很重要。
  4. 统计 n n n张图中该对象的差异位置分布,构建差异分布图。该 差异分布图即为有效感受野范围

参考链接:
1、 CNN中的感受野
2、 感受野(Receptive Field)

理论感受野的可视化

特征图的大小逐渐变小,一个特征表示的信息量越来越大,这类似于图像压缩,即:将原图感兴趣的信息提取出来,不关注的统统抛掉。提取的过程就是CNN的前向传播,抛弃的过程就是CNN的反馈学习。这里畅想一下,如果卷积核的大小能够变化那又是一番景象啊。

在这里插入图片描述

图1:可视化CNN特征图的两种方法。(左侧:可视化CNN特征图的常用方法 右侧:可视化固定大小的CNN特征图的方法)

图 1 的详细介绍(摘自原文《A guide to receptive field arithmetic for Convolutional Neural Networks》):
\quad
Figure 1: Two ways to visualize CNN feature maps. In all cases, we uses the convolution C with kernel size k = 3x3, padding size p = 1x1, stride s = 2x2. (Top row) Applying the convolution on a 5x5 input map to produce the 3x3 green feature map. (Bottom row) Applying the same convolution on top of the green feature map to produce the 2x2 orange feature map. (Left column) The common way to visualize a CNN feature map. Only looking at the feature map, we do not know where a feature is looking at (the center location of its receptive field) and how big is that region (its receptive field size). It will be impossible to keep track of the receptive field information in a deep CNN. (Right column) The fixed-sized CNN feature map visualization, where the size of each feature map is fixed, and the feature is located at the center of its receptive field.
译文:
图1:可视化CNN特征图的两种方法。 在所有情况下,我们均使用相同的内核大小k = 3x3,填充大小p = 1x1,步幅s = 2x2的卷积C。 (左上侧图中)在5x5像素的输入图上应用卷积以生成3x3的绿色特征图。 (左下侧图中)在绿色特征图的顶部应用相同的卷积以生成2x2的橙色特征图。

  • 左侧图为可视化CNN特征图的常用方法。 由于仅查看特征图( feature map)时,我们并不知道某一特征(feature)在哪里查看(其接受区域的中心位置),以及该区域有多大(其感受野区域的大小)。 所以,在深层的CNN中无法跟踪感受野的信息。
  • 右侧图为可视化固定大小的CNN特征图的方法。 其中,每个特征图的大小是固定的,并且特征均位于其感受野的中心。 即:卷积后的图像和原图一样大,具体操作就是:各个特征(可以理解为图像中的像素点)的位置在卷积后保持不变,空的部分用空白来填充。
    我们注意到,左图和右图在卷积后,其特征的数目(绿色和黄色点的数目)是一样的。

可视化具体过程

在抽象感受野计算的通用公式之前,我们先来感受一下感受野的可视化具体过程吧。举个栗子:

Question:
假设原始图像为 5 × 5 5×5 5×5,卷积核(Kernel Size)为 3 × 3 3×3 3×3,填充层(Padding size)为 1 × 1 1×1 1×1,移动步幅(Stride)为 2 × 2 2×2 2×2,依照此卷积规则,连续做两次卷积。计算每层feature map上单个像素单元所对应的感受野大小???(即:对原文《A guide to receptive field arithmetic for Convolutional Neural Networks》中 可视化CNN特征图的常用方法 的过程复现)。

Answer:
根据“感受野被定义为卷积神经网络中特征(feature)所能看到输入图像的区域,也就是:特征输出受感受野区域内的像素点的影响。”可知:

原始图像为 5 × 5 5×5 5×5卷积过程的第一步是先加padding层。经过第一次卷积Conv1后,生成 3 × 3 3×3 3×3大小的feature map(Layer1层),Layer1层feature map上每个像素单元的感受野区域RF为 3 × 3 3×3 3×3; 再经过第二次卷积Conv2后,生成 2 × 2 2×2 2×2大小的feature map(Layer2层),而由于Conv2的每个单元都是由 3 × 3 3×3 3×3范围的Conv1构成。因此,Layer2 每个神经元看到Layer1 上 3 × 3 3×3 3×3 大小的区域,回溯到原始图像,得到Layer2层feature map上每个像素单元的感受野区域RF为 7 × 7 7×7 7×7。整个过程如下图所示:

在这里插入图片描述

在这里插入图片描述

理论感受野的计算

feature map中feature size的计算

公式一:基于输入特征个数和卷积相关属性计算输出特征的个数

假设,每个feature map均为 n × n n×n n×n的正方形,则feature size代表每个feature map的边长。规定,原始图像为初始层feature map 0 0 0,输出层为最终层feature map n n n计算方向为:从原始图像 → \rightarrow 最终输出。 逐层计算从上一层feature map,使用固定大小 kernel size(k), padding size(p), stride(s) 的卷积核后,生成的下一个feature map的feature size的公式如下:
在这里插入图片描述
以文章《A guide to receptive field arithmetic for Convolutional Neural Networks》中图1左下侧的三层CNN结构为例(左下角,从下往上数):

第一层(原始图像):feature size=5×5;
第二层(Layer1):feature size=3×3;
第三层(Layer2):feature size=2×2;

可以发现,随着卷积层的增加,每一层feature map的feature size是逐渐减小的。但是,feature map中每个feature(即:每一层feature map中的单一像素)上神经元可以“感知”到的原始图像的感受野区域却是逐渐增大的。

第一层(原始图像):RF size=1×1(即:原始图像上单个像素对应到原始图像的感受野为 1 × 1 1×1 1×1);
第二层(Layer1):RF size=3×3(即:第一层feature map上单个像素对应到原始图像的感受野区域为 3 × 3 3×3 3×3);
第三层(Layer2):RF size=7×7(即:第二层feature map上单个像素对应到原始图像的感受野区域为 7 × 7 7×7 7×7);

Receptive Field size的计算——自底向顶

感受野是个相对概念,某层feature map上的元素看到前面不同层上的区域范围是不同的,通常在不特殊指定的情况下,感受野指的是看到输入图像上的区域

准确计算感受野,需要回答两个子问,即:视野中心在哪视野范围多大。只有看到”合适范围的信息”才可能做出正确的判断;否则,就可能“盲人摸象”或者“一览众山小”。例如:在目标识别问题中,我们需要知道神经元看到是哪个区域,才能合理推断物体在哪以及判断是什么物体。

公式二:计算输出特征图的jump(即:相邻特征feature之间的距离),等于输入图的jump与输入特征个数(执行卷积操作时jump的个数,stride的大小)的乘积
j o u t = j i n ∗ s \begin{aligned} j_{out}&=j_{in}*s\\ \end{aligned} jout=jins
公式三:计算输出特征图的receptive field size,等于k个输入特征覆盖区域加上边界上输入特征的感受野覆盖的附加区域。
r o u t = r i n + ( k − 1 ) ∗ j i n \begin{aligned} r_{out}&=r_{in}+(k-1)*j_{in}\\ \end{aligned} rout=rin+(k1)jin
公式四:计算第一个输出特征的感受野的中心位置,等于第一个输入特征的中心位置,加上第一个输入特征位置到第一个卷积核中心位置的距离,再减去填充区域大小。注意:这里都需要乘上输入特征图的jump,从而获取实际距离或间隔。(左上角(起始)特征的中心坐标start,其中特征的中心坐标定义为其感受野的中心坐标(如上述固定大小CNN特征图所述)。)
s t a r t o u t = s t a r t i n + ( k − 1 2 − p ) ∗ j i n \begin{aligned} start_{out}&=start_{in}+(\frac{k-1}{2}-p)*j_{in} \end{aligned} startout=startin+(2k1p)jin
变量说明:

  • n n n:number of features(特征数)
  • r r r:receptive field size(感受野)
  • j j j:jump (distance between two consecutive features)(两个连续特征之间的距离)
  • s t a r t start start:center coordinate of the first feature(起始特征的中点坐标)
  • k k k:convolution kernel size(卷积核尺寸)
  • p p p:convolution padding size(填充单元尺寸)
  • s s s:convolution stride size(步幅stride)

备注:

  • 此处一个feature可以理解为对应feature map图上的一个像素格子。
  • 计算方向为:从原始图像 → \rightarrow 最终输出。 利用上述公式可以逐层计算出新生成的每一层feature map对应的输出特征数( n o u t n_{out} nout)、两个连续输出特征之间的距离( j o u t j_{out} jout)、感受野区域尺寸( r o u t r_{out} rout)以及起始特征的中点坐标( s t a r t o u t start_{out} startout)。

在这里插入图片描述

图3 : 反映了图1所示的示例中感受野的计算过程。(第一行:变量和计算公式,第二行和最后一行:在给定的情况下将其应用于输入图像,计算对应的输出层感受野的过程。)

图 3 的详细介绍(摘自原文《A guide to receptive field arithmetic for Convolutional Neural Networks》):
Figure 3: Applying the receptive field calculation on the example given in Figure 1. The first row shows the notations and general equations, while the second and the last row shows the process of applying it to calculate the receptive field of the output layer given the input layer information.

整合公式二和公式三,最终得到 感受野的计算公式如下:
l k = l k − 1 + [ ( f k − 1 ) ∗ ∏ i = 1 k − 1 s i ] l_k= l_{k−1}+\Bigg[(f_k−1)∗∏_{i=1}^{k−1}s_i\Bigg] lk=lk1+[(fk1)i=1k1si]

其中 l k − 1 l_{k−1} lk1为第 k − 1 k−1 k1 层对应的感受野大小 f k f_k fk为第 k k k 层的卷积核大小,或者是池化层的池化尺寸大小 l 0 = 1 l_{0}=1 l0=1,表示输入图像的每个单元的感受野为 1 1 1,这应该很好理解,因为每个像素只能看到自己。 计算方向为:从原始图像 → \rightarrow 最终输出。

The receptive field (RF) lk of layer k is:
l k = l k − 1 + [ ( f k − 1 ) ∗ ∏ i = 1 k − 1 s i ] l_k= l_{k−1}+\Bigg[(f_k−1)∗∏_{i=1}^{k−1}s_i\Bigg] lk=lk1+[(fk1)i=1k1si]
where l k − 1 l_{k−1} lk1 is the receptive field of layer k − 1 k−1 k1 , f k f_k fk is the filter size (height or width, but assuming they are the same here), and s i s_i si is the stride of layer 𝑖.

The formula above calculates receptive field from bottom up (from layer 1). Intuitively, RF in layer k covers ( f k − 1 ) ∗ s k − 1 (f_k-1)*s_{k-1} (fk1)sk1more pixels relative with layer 𝑘−1 . However, the increment needs to be translated to the first layer, so the increments is a factorial — a stride in layer 𝑘−1 is exponentially more strides in the lower layers.

如果有dilated conv的话,计算公式为

R F l + 1 = R F l + ( k e r n e l _ s i z e l + 1 − 1 ) × f e a t u r e _ s t r i d e l × d i l a t i o n l + 1 RF_{l+1}=RF_{l}+(kernel\_size_{l+1}-1)\times feature\_stride_{l}\times dilation_{l+1} RFl+1=RFl+(kernel_sizel+11)×feature_stridel×dilationl+1
在这里插入图片描述

参考链接:
感受野
对CNN感受野一些理解

典型范例:

感受野的计算是逐层进行的,以下表中的网络结构为例。

No.LayersKernel SizeStride
1Conv13*31
2Pool12*22
3Conv23*31
4Pool22*22
5Conv33*31
6Conv43*31
7Pool32*22

感受野初始值 l 0 = 1 l_0=1 l0=1,每层的感受野计算过程如下:

l 0 = 1 l_0=1 l0=1
l 1 = 1 + ( 3 − 1 ) = 3 l_1=1+(3−1)=3 l1=1+(31)=3
l 2 = 3 + ( 2 − 1 ) ∗ 1 = 4 l_2=3+(2−1)∗1=4 l2=3+(21)1=4
l 3 = 4 + ( 3 − 1 ) ∗ 1 ∗ 2 = 8 l_3=4+(3−1)∗1∗2=8 l3=4+(31)12=8
l 4 = 8 + ( 2 − 1 ) ∗ 1 ∗ 2 ∗ 1 = 10 l_4=8+(2−1)∗1∗2∗1=10 l4=8+(21)121=10
l 5 = 10 + ( 3 − 1 ) ∗ 1 ∗ 2 ∗ 1 ∗ 2 = 18 l_5=10+(3−1)∗1∗2∗1∗2=18 l5=10+(31)1212=18
l 6 = 18 + ( 3 − 1 ) ∗ 1 ∗ 2 ∗ 1 ∗ 2 ∗ 1 = 26 l_6=18+(3−1)∗1∗2∗1∗2∗1=26 l6=18+(31)12121=26
l 7 = 26 + ( 2 − 1 ) ∗ 1 ∗ 2 ∗ 1 ∗ 2 ∗ 1 ∗ 1 = 30 l_7=26+(2−1)∗1∗2∗1∗2∗1∗1=30 l7=26+(21)121211=30

参考链接:
CNN 感受野计算公式

课堂测试题:
在这里插入图片描述

Receptive Field size计算公式的推导过程

Receptive Field size计算公式的推导过程参考原文:蓝荣祎——深度神经网络中的感受野(Receptive Field)

由于图像是二维的,具有空间信息,因此感受野的实质其实也是一个二维区域。但业界通常将感受野定义为一个正方形区域,从而能通过边长来描述其大小。在接下来的讨论中,本文也只考虑宽度一个方向。

(1)首先,我们先按照下图所示对输入图像的像素进行编号。

在这里插入图片描述
(2)接下来,我们使用一种并不常见的方式来展示CNN的层与层之间的关系(如下图,请将脑袋向左倒45°观看>_<),并且配上我们对原图像的编号。

在这里插入图片描述
在上图中,数字代表某单元能够看到的原始图像像素,我们用 r n r_n rn表示第 n n n个卷积层中,每个单元的感受野,用 k n k_n kn s n s_n sn表示第 n n n个卷积层的 k e r n e l s i z e kernel_{size} kernelsize s t r i d e stride stride

(3)执行Conv Filter1卷积: 对Raw Image利用 k e r n e l s i z e = 3 , s t r i d e = 2 kernel_{size}=3, stride=2 kernelsize=3,stride=2的Filter 1 进行卷积, 得到的 f m a p 1 fmap1 fmap1 f m a p fmap fmap 为feature map的简称,为每一个conv层所产生的输出)的感受野为3。

序列[1 2 3]表示fmap1的第一个单元能看见原图像中的123这三个像素,而第二个单元则能看见345

(2)执行Conv Filter2卷积: 这两个单元随后又被 k e r n e l s i z e = 2 , s t r i d e = 1 kernel_{size}=2,stride=1 kernelsize=2stride=1的Filter 2 进行卷积, 得到的 f m a p 2 fmap2 fmap2的感受野为5。

fmap2的第一个单元能够看见原图像中的1,2,3,4,55个像素(即取[1 2 3][3 4 5]的并集)。

(3)公式归纳

可以看到,[1 2 3]和[3 4 5]之间因为Filter 1的 s t r i d e = 2 stride=2 stride=2而错开(偏移)了两位,只有3是重叠的。对于卷积两个感受野为3的上层单元,下一层最大能获得的感受野为 3*2=6,但因为有重叠,因此要减去 ( k e r n e l s i z e − 1 ) (kernel_{size} - 1) (kernelsize1)个重叠部分,而重叠部分的计算方式则为感受野减去前面所说的偏移量,这里是2。因此,我们就得到
在这里插入图片描述
继续往下一层看,我们会发现[1 2 3 4 5]和[3 4 5 6 7]的偏移量仍为2,并不简单地等于上一层的 s 2 = 1 s_2=1 s2=1,这是因为之前的stride对后续层的影响是永久性的,而且是累积相乘的关系(例如,在fmap3中,偏移量已经累积到4了),也就是说 r 3 r_3 r3应该这样计算:

在这里插入图片描述
同理:
在这里插入图片描述
递推公式的思想逻辑:

(1)计算第 n n n个卷积层要合并的像素总量:第 n n n个卷积层的感受野等于前一个卷积层的感受野输出再乘以第 n n n个卷积层的 k e r n e l s i z e kernel_{size} kernelsize,即: r n − 1 × k n r_{n-1}×k_n rn1×kn

(2)计算第 n n n个卷积层随kernel迭代移动stride步长,前后两个kernel之间重复的像素总量:上一步计算出第 n n n个卷积层要合并多少个像素,这里算出的是总的量,还要减去之间有重复的量,第 n n n卷积层总共要合并 k n k_n kn个,那么前后两两相比较,空隙共有 ( k n − 1 ) (k_n-1) (kn1)个。至于每个空隙对应的重复像素总量则为 ( r n − 1 − ∏ i = 1 n − 1 s i ) (r_{n-1}-∏^{n-1}_{i=1}s_i) rn1i=1n1si个,比如说:第一层和第二层有重复,第二层和第三层也有重复等等,如果要计算每两个之间重复的量有多少。首先,每层共有 r n − 1 r_{n-1} rn1个数字,需要减去往右偏移的量,即 s t r i d e stride stride,第 1 1 1个卷积层为 s t r i d e 1 stride_1 stride1,第二层会在第一层的基础上偏移 s t r i d e 2 stride_2 stride2,即:总共偏移了 s t r i d e 1 ∗ s t r i d e 2 stride_1*stride_2 stride1stride2。因此,偏移量是一个乘积的累计效果, 所以计算公式如下:
在这里插入图片描述
经过去括号简化。可得下面式子:
r n = r n − 1 + [ ( k n − 1 ) ∗ ∏ i = 1 n − 1 s i ] r_n= r_{n−1}+\Bigg[(k_n−1)∗∏_{i=1}^{n−1}s_i\Bigg] rn=rn1+[(kn1)i=1n1si]

为什么存在重复的部分??
\quad
通过对 n − 1 n-1 n1层输出特征图的 k n × k n k_n×k_n kn×kn个感受野为 r n − 1 r_{n−1} rn1的特征单元进行卷积,得到的第 n n n层输出特征单元的最大的感受野 r n − 1 × k n r_{n−1}×k_n rn1×kn
然而,在对 n − 1 n-1 n1层输入特征图进行卷积时,经常会由于 s n − 1 小 于 k n − 1 s_{n−1}小于k_{n−1} sn1kn1而存在重叠,因此要减去 ( k n − 1 ) (k_{n}−1) (kn1)个重叠部分( k n = 2 k_n=2 kn=2 存在一个重叠部分, k n = 3 k_n=3 kn=3 存在两个重叠部分)。
重叠的部分怎么算呢?显然重叠的部分一定是与你的stride的有关的,如果你的stride很大,显然是不会有重合。所以,越小重合越多。(注意:这里计算的是在原图上的重合)。显然, k n − s n k_n−s_n knsn表示的是一次重合的多少。如果要计算在原图上的重合,则
(kn−sn)×rn−1
是不是很简单啊,由此我们可以知道要求第n层输出的感受野,就要知道前一层n-1的感受野,以及本层的kernel和stride大小,这是一个不断递推的过程.

参考链接:
一文深入学习什么是感受野
感受野的计算问题

Receptive Field size的计算——至顶向下

这个算法从top往下层层迭代直到追溯回input image,从而计算𝑓𝑒𝑎𝑡𝑢𝑟𝑒 𝑚𝑎𝑝 经过第 N 层卷积(或者池化)后,输出的一个 "像素"对应的感受野RF。递推公式如下:

R F ( N − 1 ) = ( R F N − 1 ) × s t r i d e ( N − 1 ) + k s i z e ( N − 1 ) RF_{(N-1)} = (RF_{N} - 1) × stride_{(N-1)} + ksize_{(N-1)} RF(N1)=(RFN1)×stride(N1)+ksize(N1)

设网络共有 N 层卷积层,卷积核采用正方形。其中, R F RF RF是感受野, s t r i d e stride stride是步长, k s i z e ksize ksize是卷积核大小。

计算感受野大小时,忽略了图像边缘的影响,即:不考虑padding的大小。先计算最深层前一层上的感受野,然后逐渐传递到第一层(即:Input image)。起始层记为第N层,该层中的某一点的感受野在本层中为1,即: R F N = 1 RF_N=1 RFN=1。根据上述公式,依次迭代,直至Input image,计算得到 R F 0 RF_0 RF0, 即为欲求的第 N N N层feature map上一个feature所对应的输入图像的感受野。计算公式的推导过程图解如下:

在这里插入图片描述

我来解释一下这个公式。如下图所示,首先,我们的问题是右一的红叉叉映射到左一中对应的感受野应该是什么size?

在这里插入图片描述

基本思路:

(1)右一的红叉叉映射到中间是什么size?因为卷积核 k s i z e ksize ksize 3 × 3 3×3 3×3,填充层 p a d d i n g = 1 × 1 padding=1×1 padding=1×1,移动步长 s t r i d e = 2 stride=2 stride=2,所以,右一的红叉叉映射到中间的size= 3 × 3 3×3 3×3
(2)接下来,我们如果算出来中间 3 × 3 3×3 3×3 的黄框框映射到左一是什么size,就可以解决问题了。我们发现了从中间映射到左边的size等于 k e r n e l s i z e + s t r i d e ∗ ( 3 − 1 ) kernel_{size}+stride*(3-1) kernelsize+stride(31)。抽象一下就是 k e r n e l s i z e + s t r i d e ∗ ( R F N − 1 ) kernel_{size} +stride* (RF_{N} - 1) kernelsize+stride(RFN1)
(3)然后,逐层迭代下去直到迭代到第一层,就求出了右一的红叉对应的感受野RF。(备注:kernel_size和stride是左一的,而 R F N RF_{N} RFN是中间的。

典型范例01——以AlexNet为例:

在这里插入图片描述
计算conv_5的感受野:

其中,ReLU和LRN层感受野不会产生变化,所以,我们只需要考虑pool层和conv层。计算过程详情图解如下:

在这里插入图片描述

所以,CONV5层一个feature map中响应最大的值所对应的输入图中的感受野是 163 × 163 163×163 163×163 的尺寸,我们从原图中切割出一个 163 × 163 163×163 163×163 的图片块即可。这就是论文中图片块的来源。 扩大感受野,主要是通过池化和大步长卷积,卷积层对扩大感受野作用很小。

典型范例02——ZFNet的网络结构:

在这里插入图片描述

在这里插入图片描述

深层CNN的调参经验 | A practical theory for designing very deep convolutional neural networks

小卷积核的优势

小卷积核(如 3 × 3 3\times 3 3×3)通过多层叠加可取得与大卷积核(如 7 × 7 7\times 7 7×7)同等规模的感受野,此外, 采用小卷积核同时可带来两个优势:

第一,由于小卷积核需多层叠加,加深了网络深度进而增强了网络容量(model capacity)和复杂度(model cmplexity);

第二,增强网络容量的同时减小了参数个数。 示例如下:

若假设上述示例中卷积核的输入输出特征张量的深度均为C,则 7 × 7 7\times 7 7×7卷积核对应参数有 C × ( 7 × 7 × C ) = 49 C 2 C\times (7\times 7\times C)= 49C^{2} C×(7×7×C)=49C2个,而三层 3 × 3 3\times 3 3×3的卷积只需要堆叠三倍单层3\times 3卷积核个数的参数,即 3 × [ ( 3 × 3 × C ) ] = 27 C 2 3\times \left [ \left ( 3\times 3\times C \right ) \right ] = 27C^{2} 3×[(3×3×C)]=27C2,远远小于 7 × 7 7\times 7 7×7卷积核的参数个数。

e.g.两层 3*3 卷积操作的有效区域(感受野)等价于一个5 ∗ 5 (所有filter的stride=1,pad=0),示意图如下

在这里插入图片描述

三层3 ∗ 3 卷积核操作的有效区域等价于7*7 (所有filter的stride=1,pad=0),示意图如下:
在这里插入图片描述

感受野的规律小结

  1. 经过 Conv 1*1 不会改变感受野;
  2. ReLU/BN/dropout 等元素级操作不会改变感受野;
  3. 当经过多路分支时,按照最大感受野分支计算;
  4. short-cut 操作不会改变感受野;
  5. stride为1的卷积层线性增加感受野,深度网络可以通过堆叠多层卷积增加感受野;
  6. stride为2的下采样层乘性增加感受野,但受限于输入分辨率不能随意增加;
  7. stride 为1的卷积层加在网络后面位置,会比加在前面位置获得更大感受野。

感受野是不是越大越好?

我们需要关注网络的感受野是否足够,但这并不意味着感受野越大越好,在某些场景中过大的感受野甚至会降低模型的性能。例如《The Receptive Field as a Regularizer in Deep Convolutional Neural Networks for Acoustic Scene Classification》论文中通过 1 × 1 1×1 1×1的 Conv替换 3 × 3 3×3 3×3的Conv以缩小ResNet和DenseNet等网络的感受野,在ASC场景获取了比原始模型更高的精度;《Gated Recurrent Convolution Neural Network for OCR 》论文提出了GRCL 结构来限制无效感受野,提高了STR的识别精度。

多路感受野融合提高精度?

Inception网络提出多路卷积融合的思路,实际是在同一个尺度上多种感受野信息的融合,主要是为了解决图像大小分布差异较大的问题。《MixNet: Mixed Depthwise Convolutional Kernels》Google Brain最近提出Mixed Depthwise Convolution,类似Inception的单元结构,以此来提高网络表达能力。Google Brain在MobilenetV2的基础上用MDConv替换 3 × 3 3×3 3×3的 Depthwise Conv进行了多组实验,在大多数情况下都取得了更好的效果,接着在Imagenet上用Auto ML搜索出MixNet-L,取得了78.9%的top-1分类精度,同时FLOPs小于600M,超过Resnet153。

在这里插入图片描述

感受野用于目标检测中设置anchor

现在流行的目标检测网络大部分都是基于anchor的,比如SSD系列,v2以后的yolo,还有faster rcnn系列。

基于anchor的目标检测网络会预设一组大小不同的anchor,比如32x32、64x64、128x128、256x256,这么多anchor,我们应该放置在哪几层比较合适呢?这个时候感受野的大小是一个重要的考虑因素。

放置anchor层的特征感受野应该跟anchor大小相匹配,感受野比anchor大太多不好,小太多也不好。如果感受野比anchor小很多,就好比只给你一只脚,让你说出这是什么鸟一样。如果感受野比anchor大很多,则好比给你一张世界地图,让你指出故宫在哪儿一样。

《S3FD: Single Shot Scale-invariant Face Detector》这篇人脸检测器论文就是依据感受野来设计anchor的大小的一个例子,文中的原话是:we design anchor scales based on the effective receptive field《FaceBoxes: A CPU Real-time Face Detector with High Accuracy》这篇论文在设计多尺度anchor的时候,依据同样是感受野,文章的一个贡献为:We introduce the Multiple Scale Convolutional Layers (MSCL) to handle various scales of face via enriching receptive fields and discretizing anchors over layers。

参考链接:
『计算机视觉』感受野和anchor

检验感受野计算正确与否的实用小工具

感受野计算的是否正确,可以使用FOMORO AI,这是三个高级工程师搞的网站,简单的输入网络参数,就直接把你的感受野计算出来。界面如下:
在这里插入图片描述
另外,TensorFlow官方感受野计算代码:https://github.com/tensorflow/tensorflow/tree/v2.0.0-rc2/tensorflow/contrib/receptive_field

参考链接:
如何计算感受野(Receptive Field)——原理

感受野计算——Python实现

卷积神经网络由输入维度计算输出维度:

output size = ( input size - kernel size + 2 * padding ) / stride + 1 

卷积神经网络由输出维度计算输入维度:

input size = (output size - 1* stride - 2 * padding + kernel size

典型范例:

#Python
#卷积层输出大小和感受野大小的计算
net_struct = {'alexnet': {'net':[[11,4,0],[3,2,0],[5,1,2],[3,2,0],[3,1,1],[3,1,1],[3,1,1],[3,2,0]],
                   'name':['conv1','pool1','conv2','pool2','conv3','conv4','conv5','pool5']},
       'vgg16': {'net':[[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[3,1,1],
                        [2,2,0],[3,1,1],[3,1,1],[3,1,1],[2,2,0],[3,1,1],[3,1,1],[3,1,1],[2,2,0]],
                 'name':['conv1_1','conv1_2','pool1','conv2_1','conv2_2','pool2','conv3_1','conv3_2',
                         'conv3_3', 'pool3','conv4_1','conv4_2','conv4_3','pool4','conv5_1','conv5_2','conv5_3','pool5']},
       'zf-5':{'net': [[7,2,3],[3,2,1],[5,2,2],[3,2,1],[3,1,1],[3,1,1],[3,1,1]],
               'name': ['conv1','pool1','conv2','pool2','conv3','conv4','conv5']}}

imsize = 224

def outFromIn(isz, net, layernum):#从前向后算输出维度
    totstride = 1
    insize = isz
    for layer in range(layernum):
        fsize, stride, pad = net[layer]
        outsize = (insize - fsize + 2*pad) / stride + 1
        insize = outsize
        totstride = totstride * stride
    return outsize, totstride

def inFromOut(net, layernum):#从后向前算感受野 返回该层元素在原始图片中的感受野
    RF = 1
    for layer in reversed(range(layernum)):
        fsize, stride, pad = net[layer]
        RF = ((RF -1)* stride) + fsize #计算感受野大小时,忽略了图像边缘的影响,即不考虑padding的大小
    return RF


if __name__ == '__main__':
    print "layer output sizes given image = %dx%d" % (imsize, imsize)
    for net in net_struct.keys():
        print '************net structrue name is %s**************'% net
        for i in range(len(net_struct[net]['net'])):
            p = outFromIn(imsize,net_struct[net]['net'], i+1)
            rf = inFromOut(net_struct[net]['net'], i+1)
            print "Layer Name = %s, Output size = %3d, Stride = % 3d, RF size = %3d" % (net_struct[net]['name'][i], p[0], p[1], rf)

参考链接:
【深度学习】感受野

附录:

本博文撰写过程中参考的一些文章链接如下:

CNN中的感受野

AI疯狂进阶——感受野篇

彻底搞懂感受野的含义与计算

有效感受野

感受野

感受野

卷积神经网络的感受野

【深度学习】感受野

如何计算感受野(Receptive Field)——原理

如何理解CNN中的感受野(receptive-field)?

Receptive field(感受野)

关于感受野的理解与计算

CNN中感受野的理解

AI疯狂进阶——感受野篇

A guide to receptive field arithmetic for Convolutional Neural Networks

感受野( Receptive Field)

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yale曼陀罗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值