在机器视觉领域的深度神经网络中有一个概念叫作感觉野,用来表示网络内部的不一样位置的神经元对原图像的感觉范围的大小。神经元之因此没法对原始图像的全部信息进行感知,是由于在这些网络结构中广泛使用卷积层和pooling层,在层与层之间均为局部相连(经过sliding filter)。神经元感觉野的值越大表示其能接触到的原始图像范围就越大,也意味着他可能蕴含更为全局、语义层次更高的特征;而值越小则表示其所包含的特征越趋向于局部和细节。所以感觉野的值能够大体用来判断每一层的抽象层次。网络
那么这个感觉野要如何计算呢?咱们先看下面这个例子。ide
能够看到在Conv1中的每个单元所能看到的原始图像范围是3*3,而因为Conv2的每一个单元都是由 范围的Conv1构成,所以回溯到原始图像,实际上是可以看到
的原始图像范围的。所以咱们说Conv1的感觉野是3,Conv2的感觉野是5. 输入图像的每一个单元的感觉野被定义为1,这应该很好理解,由于每一个像素只能看到本身。es5
经过上图这种图示的方式咱们能够“目测”出每一层的感觉野是多大,但对于层数过多、过于复杂的网络结构来讲,用这种办法可能就不够聪明了。所以咱们但愿可以概括出这其中的规律,并用公式来描述,这样就能够对任意复杂的网络结构计算其每一层的感觉野了。那么咱们下面看看这其中的规律为什么。3d
因为图像是二维的,具备空间信息,所以感觉野的实质其实也是一个二维区域。但业界一般将感觉野定义为一个正方形区域,所以也就使用边长来描述其大小了。在接下来的讨论中,本文也只考虑宽度一个方向。咱们先按照下图所示对输入图像的像素进行编号。orm
接下来咱们使用一种并不常见的方式来展现CNN的层与层之间的关系(以下图,请将脑壳向左倒45°观看>_<),而且配上咱们对原图像的编号。blog
图中黑色的数字所构成的层为原图像或者是卷积层,数字表示某单元可以看到的原始图像像素。咱们用 来表示第
个卷积层中,每一个单元的感觉野(即数字序列的长度);蓝色的部分表示卷积操做,用
和
分别表示第
个卷积层的kernel_size和stride。get
对Raw Image进行kernel_size=3, stride 2的卷积操做所获得的fmap1 (fmap为feature map的简称,为每个conv层所产生的输出)的结果是显而易见的。序列[1 2 3]表示fmap1的第一个单元能看见原图像中的1,2,3这三个像素,而第二个单元则能看见3,4,5。这两个单元随后又被kernel_size=2,stride 1的Filter 2进行卷积,于是获得的fmap2的第一个单元可以看见原图像中的1,2,3,4,5共5个像素(即取[1 2 3]和[3 4 5]的并集)。form
接下来咱们尝试一下如何用公式来表述上述过程。能够看到,[1 2 3]和[3 4 5]之间由于Filter 1的stride 2而错开(偏移)了两位,而3是重叠的。对于卷积两个感觉野为3的上层单元,下一层最大能得到的感觉野为 ,但由于有重叠,所以要减去(kernel_size - 1)个重叠部分,而重叠部分的计算方式则为感觉野减去前面所说的偏移量,这里是2. 所以咱们就获得
。继续往下一层看,咱们会发现[1 2 3 4 5]和[3 4 5 6 7]的偏移量仍为2,并不简单地等于上一层的
,这是由于以前的stride对后续层的影响是永久性的,并且是累积相乘的关系(例如,在fmap3中,偏移量已经累积到4了),也就是说
应该这样求class
。神经网络
以此类推,
。
因而咱们就能够获得关于计算感觉野的抽象公式了:
,
通过简单的代数变换以后,最终形式为:
。
这种计算方法来时知乎,原文连接:https://zhuanlan.zhihu.com/p/28492837
原文写的很好,解释方法新奇易懂,因此直接粘过来了,方便之后本身查找。
#TODO