论文笔记-卷积神经网络中的感受野
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论文笔记-卷积神经网络中的感受野相关的知识,希望对你有一定的参考价值。
参考技术A 感受野(receptive field或者field of view)是卷积神经网络中的一个基本概念。与全连接层中每个输出值都与全部输入特征值有关不同的是,卷积层的一个输出值只与一部分的输入特征值有关。输入特征值中与输出特征值有关的部分就是它的感受野。
对于处于中心位置的特征值,对于输出的影响会更大,根据实验结果在一个接受野的影响分布是高斯分布。由此也引入了一个 有效感受野 的概念,因为高斯分布在中心位置强度更高,然后逐渐向周围递减。
我们想用数学的方法来描述一个接收野中的每个输入像素对网络上一个单元层的输出的影响程度,并研究这种影响是如何在输出单元的接收野内分布的。为了简化符号,我们只考虑每层上的一个信道,但是对于具有更多输入和输出的卷积层,可以很容易地得到类似的结果通道。
假设每层上的像素用(i,j)索引,其中心位于(0,0)。表示第层的第(i,j)个像素为 ,其中 作为网络的输入, 作为第n层的输出。我们要测量每个 对 贡献了多少。我们将这个中央输出单元的有效感受野(ERF)定义为包含任何输入像素且对其影响不可忽略的区域单位。
本文采用偏导数 ,j来度量 随 有多大的变化;因此,它是 相对于 重要性的自然度量。然而,这种度量不仅取决于网络的权值,而且在大多数情况下也依赖于输入,因此我们的大多数结果都是期望值大于输入分布。
偏导数 可以用反向传播法计算。在标准设置中,反向传播传播相对于某个损耗函数的误差梯度。假设我们有一个任意的损失函数l,根据链式规则,我们有
我们可以设置误差梯度 和 ,然后将这个梯度从那里传播回网络。得到的 ,相当于期望的\\partialy_0,0\\partial x^0_i,j。这里我们使用无显式损失函数的反向传播过程,并且该过程可以用标准神经网络轻松实现工具。
在下面我们首先考虑线性网络,其中这个导数不依赖于输入,而纯粹是网络权重和(i,j),它清楚地显示了感受野中像素的影响是如何分布的。然后我们继续考虑更现代的架构设计,并讨论非线性激活、dropout、子采样、空洞卷积和跳跃连接对ERF的影响。
2.1最简单的情况:权值都等于1的卷积层
考虑使用k×k卷积核的步长为1的卷积层的情况,每层一个单通道,无非线性,叠加成一个深线性CNN。在这个分析中,我们忽略了所有层上的偏差。我们首先分析权值都等于1的卷积核。(推理过程公式好多,看原文吧……)
在本节中,我们将实证研究各种深层CNN架构的ERF。我们首先使用人工构造的CNN模型来验证我们分析中的理论结果。然后,我们提出了在实际数据集上训练深层cnn时ERF如何变化的观察结果。对于所有ERF研究,我们在输出平面的中心放置一个梯度信号1,在其他任何地方放置0,然后通过网络反向传播该梯度,得到输入的梯度。
3.1验证理论结果
我们首先在人工构建的CNN中验证我们的理论结果。为了计算ERF我们使用随机输入,对于所有随机权重网络,我们进行适当的随机初始化。在本节中,我们验证以下内容结果:
ERF是高斯分布的 。如图所示在图1中,我们可以观察到均匀加权卷积核和随机加权,没有非线性激活卷积核的完美高斯形状,以及随机加权非线性激活的卷积核的近似高斯形状。加上ReLU非线性使得分布的高斯性变小,因为ERF的分布也取决于输入。另一个原因是ReLU单元的一半输入输出正好为零,而且很容易为输出平面上的中心像素设置零输出,这意味着感受野的路径无法到达输出,因此梯度都为零。在这里,ERF在不同的传输种子下平均运行20次。下图显示了具有20层随机权值、具有不同非线性的网络的ERF。在这里,结果是不同的随机权重以及不同的随机输入平均运行的100次的结果。在这种情况下,感受野更像高斯分布。
绝对增长和 相对收缩 。图2中,我们给出了ERF尺寸的改变和ERF相对于理论RF的比例随卷积层数的变化。ERF大小的最佳拟合线在对数域的斜率为0.56,而ERF比值的拟合线斜率为-0.43。这表明ERF大小对于 呈线性增长,ERF比率对于 呈线性缩小。注意这里我们使用2个标准偏差作为ERF大小的测量值,即任何大于中心点1−95.45%的像素都被视为ERF。ERF大小由ERF中像素数目的平方根表示,而理论RF大小是平方的边长,在该边长中,所有像素对输出像素的影响都是非零的,无论多么小。所有实验是在超过20次的结果上平均得到的。
3.2在训练过程中ERF是如何演变的
在这一部分中,我们将研究分类CNN和语义分割CNN最顶层的单元ERF在训练过程中是如何演变的。对于这两个任务,我们采用了 ResNet架构,它广泛地使用了skip-connection。分析表明,该网络的ERF应明显小于理论感受野。这是我们最初观察到的。有趣的是,随着网络的学习,ERF变得更大,并且在训练结束时,ERF明显大于初始ERF。
对于分类任务,我们在CIFAR-10数据集上训练了一个包含17个残差块的ResNet。在训练结束时,该网络的测试准确率达到89%。请注意,在这个实验中,我们没有使用池或降采样,而是专门关注具有跳过连接的体系结构。网络的精确度虽然不是最先进的,但仍然相当高。在图3中,我们显示了在训练开始时(随机初始化权重)和训练结束时,当达到最佳验证精度时,32×32图像空间上的有效感受野。请注意,我们网络的理论接收场实际上是74×74,大于图像大小,但是ERF仍然可以完全填充图像。比较训练前后的结果,我们发现有效感受野有所增加很明显。
对于语义分割任务利用CamVid数据集进行城市场景分割。我们训练了一个“前端”模型,它是一个纯粹的卷积网络,它预测输出的分辨率略低。该网络与VGG网络在许多以前的著作中所起的作用相同。我们训练了一个ResNet,16个残差块交错,每个子采样操作的因子为2。由于这些子采样操作,输出是输入大小的1/16。对于这个模型,顶层卷积层单元的理论感受野为505×505。然而,如图3所示,在训练开始时,ERF只得到直径为100的部分。我们再次观察到,在训练过程中,ERF的尺寸增大,最后达到直径约为150的直径。
上述分析表明ERF只占理论接收野的一小部分,这对于需要较大接收能力的任务是不可取的领域。
新的初始化。 一增加有效感受野的简单方法是控制初始权重。我们提出了一种新的随机权值初始化方案,使得卷积核中心的权值具有较小的尺度,而外部的权值较大,这使得中心的集中度向外围扩散。实际上,我们可以用任何初始化方法对网络进行初始化,然后根据中心低标度、外标度高的分布来调整权重。
在极端情况下,我们可以优化w(m)以使ERF大小最大化,或者等价地使等式(前面推公式部分里的公式)中的方差最大化。解决这个优化问题的结果是在卷积核的4个角上平均地设置权重,而其他地方都是0。但是,使用此解决方案进行随机权重初始化过于激进,并且将大量权重保留为0会使学习变慢。这种想法的温和版本通常是有效的更好。
我们用这种初始化方法训练了一个用于CIFAR-10分类任务的CNN,使用了几种随机种子。在一些情况下,与更标准的初始化相比,我们的训练速度提高了30%。但总的来说,这种方法的好处并不总是如此很重要。
我们请注意,无论我们如何改变w(m),有效感受野仍然是高斯分布的,因此上述建议只解决了问题部分。
改变构架。 一个潜在的更好的方法是对cnn进行架构上的更改,这可能会改变在更基本的方面。例如,我们不用将CNN中的每个单元连接到本地矩形卷积窗口,而是可以使用相同的连接数将每个单元稀疏地连接到下层的一个较大区域。空洞卷积属于这一类,但我们可以进一步推进,并使用不类似网格的稀疏连接。
与生物神经的联系网络。 在我们的分析表明,深部CNN中的有效接收场实际上比我们以前想象的要慢得多。这表明即使经过许多卷积层,仍然保留了许多局部信息。这一发现与深层生物网络中一些长期持有的相关概念相矛盾。哺乳动物视觉系统的一个普遍特征是分为“什么”和“哪里”路径。沿着what或where路径进行,连通性的性质逐渐改变:感受野大小增加,空间组织变得松散,直到没有明显的视网膜色素组织;视网膜脱离意味着单个神经元对视野中的面部等物体做出反应。然而,如果ERF比RF小,这表明表示可以保留位置信息,同时也提出了一个有趣的问题,即这些区域在发育过程中的大小变化。
我们的分析的第二个相关影响是,它表明卷积网络可能会自动地产生一种中心凹表现形式。人类视网膜中央凹只在中心像素附近提取高分辨率信息。等分辨率的子场的排列使得它们的大小随着距中心的距离而增大固定。在视网膜的外围,低分辨率的信息是从图像的较大区域提取的。一些神经网络已经明确地构造了这种形式的表示。然而,由于卷积网络形成高斯感受野,其底层表示自然会有这种感受野特性。
与之前研究的联系。 虽然CNN中的感受野尚未得到深入研究,一些人在计算方差如何通过网络演化方面进行了类似的分析。他们开发了一个很好的卷积层初始化方案,遵循的原则是方差在经过网络。
研究人员为了理解神经网络是如何工作的,我们还利用了可视化技术。[14] 展示了使用自然图像先验的重要性,以及卷积层的激活将代表什么。[22]使用反褶积网络来显示图像中像素点与被激活神经元之间的关系。[23]对感受野进行了实证研究,并将其作为定位的提示。也有可视化研究使用梯度上升技术[4]产生有趣的图像,如[15]。这些都集中在单位激活或特征图上,而不是我们在这里研究的有效感受野。
本文对CNN的感受野进行了细致的研究,并对有效感受野大小进行了初步探讨。特别地,我们已经证明了在感受野内的影响分布是渐近高斯的,有效感受野只占整个理论感受野的一小部分。实证结果与我们建立的理论相呼应。我们认为这只是有效感受野研究的一个开始,它为深入了解CNN提供了一个新的视角。在未来的研究中,我们希望更多地研究在实践中影响有效感受野的因素以及如何更好地控制这些因素。
如何计算感受野大小? [关闭]
【中文标题】如何计算感受野大小? [关闭]【英文标题】:How to calculate receptive field size? [closed] 【发布时间】:2016-06-05 14:01:05 【问题描述】:我正在阅读有关使用 CNN(卷积神经网络)进行对象检测的论文。
Rich feature hierarchies for accurate object detection and semantic segmentation
这是关于感受野的引述:
The pool5 feature map is 6x6x256 = 9216 dimensional. Ignoring boundary effects, each pool5 unit has a receptive field of 195x195 pixels in the original 227x227 pixel input. A central pool5 unit has a nearly global view,
while one near the edge has a smaller, clipped support.
我的问题是:
-
感受野的定义是什么?
他们如何计算感受野的大小和位置?
我们如何使用 caffe/pycaffe 计算感受野的边界矩形?
【问题讨论】:
这里有一个感受野在线计算器:fomoro.com/tools/receptive-fields rubikscode.net/2020/05/18/… 了解计算背后的数学的好资源 【参考方案1】:1) 影响最后一个卷积输出的像素区域的大小。
2) 对于每个卷积和池化操作,计算输出的大小。现在找到导致输出大小为 1x1 的输入大小。这就是感受野的大小
3) 您不需要使用库来执行此操作。对于每 2x2 池化,输出大小沿每个维度减少一半。对于跨步卷积,您还可以将每个维度的大小除以步幅。根据您是否对卷积使用填充,您可能需要削减一些尺寸。最简单的情况是使用 padding = floor(kernel size/2),这样卷积不会对输出大小产生任何额外的变化。
【讨论】:
【参考方案2】:这是计算除步幅和输出大小之外的 RF 大小的 Python 脚本。
# [filter size, stride, padding]
convnet =[[11,4,0],[3,2,0],[5,1,2],[3,2,0],[3,1,1],[3,1,1],[3,1,1],[3,2,0],[6,1,0]]
layer_name = ['conv1','pool1','conv2','pool2','conv3','conv4','conv5','pool5','fc6-conv']
imsize = 227
def outFromIn(isz, layernum = 9, net = convnet):
if layernum>len(net): layernum=len(net)
totstride = 1
insize = isz
#for layerparams in net:
for layer in range(layernum):
fsize, stride, pad = net[layer]
outsize = (insize - fsize + 2*pad) / stride + 1
insize = outsize
totstride = totstride * stride
RFsize = isz - (outsize - 1) * totstride
return outsize, totstride, RFsize
if __name__ == '__main__':
print "layer output sizes given image = %dx%d" % (imsize, imsize)
for i in range(len(convnet)):
p = outFromIn(imsize,i+1)
print "Layer Name = %s, Output size = %3d, Stride = % 3d, RF size = %3d" % (layer_name[i], p[0], p[1], p[2])
【讨论】:
我认为是错误的。 哪一部分?请具体点。如果有任何错误报告,我将不胜感激【参考方案3】:如上所述,RF 的计算可能正确:
#Compute input size that leads to a 1x1 output size, among other things
# [filter size, stride, padding]
convnet =[[11,4,0],[3,2,0],[5,1,2],[3,2,0],[3,1,1],[3,1,1],[3,1,1],[3,2,0],[6,1,0]]
layer_name = ['conv1','pool1','conv2','pool2','conv3','conv4','conv5','pool5','fc6-conv']
imsize = 227
def outFromIn(isz, layernum = 9, net = convnet):
if layernum>len(net): layernum=len(net)
totstride = 1
insize = isz
#for layerparams in net:
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( layernum = 9, net = convnet):
if layernum>len(net): layernum=len(net)
outsize = 1
#for layerparams in net:
for layer in reversed(range(layernum)):
fsize, stride, pad = net[layer]
outsize = ((outsize -1)* stride) + fsize
RFsize = outsize
return RFsize
if __name__ == '__main__':
print "layer output sizes given image = %dx%d" % (imsize, imsize)
for i in range(len(convnet)):
p = outFromIn(imsize,i+1)
rf = inFromOut(i+1)
print "Layer Name = %s, Output size = %3d, Stride = % 3d, RF size = %3d" % (layer_name[i], p[0], p[1], rf)
【讨论】:
【参考方案4】:这是另一种直接计算感受野的方法。 *** 不支持数学公式,更易读的版本请参考Calculating Receptive Field of CNN
层$k$的感受野(RF)$l_k$是:
$$ l_k = l_k-1 + ((f_k - 1) * \prod_i=1^k-1s_i) $$
其中 $l_k-1$ 是层 $k-1$ 的感受野,$f_k$ 是过滤器大小 (高度或宽度,但假设它们在这里相同),$s_i$ 是步幅 层$i$。
上面的公式从下往上计算感受野(从层 1)。直观地说,$k$ 层中的 RF 覆盖了 $(f_k - 1) * s_k-1$ 个像素 相对于层 $k-1$。但是,增量需要转换为 第一层,所以增量是阶乘 --- $k-1$ 层的步幅是 低层的步幅呈指数级增长。
希望这有帮助。
【讨论】:
链接失效 感谢您的指出。它现在应该可以工作了。【参考方案5】:2019 年 12 月 11 日更新:
TF 库已移至https://github.com/google-research/receptive_field
另请参阅 Distill 论文“计算卷积神经网络的接收域”:https://distill.pub/2019/computing-receptive-fields/
旧:
Tensorflow 现在支持接受域计算,只需使用 tf.contrib.receptive_field
详情请见https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/receptive_field。
【讨论】:
这个页面已经不存在了,我猜当前链接是你的:github.com/google-research/receptive_field 顺便说一句,我在这里问与 GH (github.com/google-research/receptive_field/issues/1) 相同的问题,有没有办法让它与tensorflow.keras
一起工作?
让我直接在github上回复,所以我们不重复讨论:)【参考方案6】:
假设我们有一个仅由多个卷积层组成的网络架构。对于每个卷积层,我们定义了一个方形内核大小和一个膨胀率。另外,假设步长为 1。因此,您可以通过以下 python 代码计算网络的感受野:
K=[3,3] # Kernel Size
R=[1,2] # Dilation Rate
RF=1
d=1 # Depth
for k,r in zip(K,R):
support=k+(k-1)*(r-1) # r-dilated conv. adds r-1 zeros among coefficients
RF=support+(RF-1)
print('depth=%d, K=%d, R=%d, kernel support=%d'%(d,k,r,support))
d=d+1
print('Receptive Field: %d'%RF)
作为一个例子,让我们计算著名的 DnCNN(去噪卷积神经网络)[1] 的感受野 (RF)。 使用上面的代码和以下输入来计算该网络的 RF。 (你会得到 RF=35)。
# In DnCNN-S, the network has 17 convolution layers.
K=[3]*17 # Kernel Size
R=[1]*17 # Dilation Rate
[1] 张凯,等。 “超越高斯去噪器:深度 cnn 的残差学习用于图像去噪。” IEEE 图像处理汇刊 26.7 (2017): 3142-3155。
【讨论】:
以上是关于论文笔记-卷积神经网络中的感受野的主要内容,如果未能解决你的问题,请参考以下文章