ConvNets上的接收字段(接收字段大小混淆)

时间:2016-05-10 11:09:59

标签: machine-learning computer-vision neural-network deep-learning conv-neural-network

我正在从一篇论文中读到这篇文章:“我不是在第一个转换层中使用相对较大的感受域,而是在整个网络中使用非常小的3×3感受域,这些字段与每个输入的输入卷积在一起像素(有步幅1)。很容易看出,两个3×3转换层的堆叠(中间没有空间池)具有5×5的有效感受域;三个这样的层具有7×7有效接收场“。

他们如何以7x7的重复领域结束?

这就是我理解的方式:假设我们有一个100x100的图像。

第一层:对图像进行零填充并使用3x3滤镜对其进行处理,输出另一个100x100滤镜图像。

第二层:对先前过滤的图像进行零填充,并将其与另一个3x3过滤器进行卷积,输出另一个100x100过滤后的图像。

第3层:对先前过滤的图像进行零填充,并将其与另一个3x3过滤器进行卷积,输出最终的100x100过滤图像。

我在那里错过了什么?

4 个答案:

答案 0 :(得分:6)

这是一种思考方式。考虑以下小图像,每个像素编号如下:

00 01 02 03 04 05 06
10 11 12 13 14 15 16
20 21 22 23 24 25 26
30 31 32 33 34 35 36
40 41 42 43 44 45 46
50 51 52 53 54 55 56
60 61 62 63 64 65 66

现在考虑中心的像素33。对于第一个3x3卷积,像素33处的生成值将包含像素22,23,24,32,33,34,42,43和44的值。但请注意,每个像素也将包含他们的周围的像素值。

对于下一个3x3卷积,像素33将再次合并其周围像素的值,但现在,这些像素的值合并了来自原始图像的周围像素。实际上,这意味着像素33的值由达到5x5“平方影响力”的值来控制。

每个额外的3x3卷积都会使每个方向上的另一个像素拉伸有效的感受野。

我希望这不会让它更令人困惑......

答案 1 :(得分:2)

                  16          ------> Layer3
                13 14 15      ------->Layer2
              8 9 10 11 12    ------->Layer1
              1 2 3 4 5 6 7   ------->Input Layer

为了更清晰,我们考虑用1D代替2D。将每个数值视为一个像素,将每个垂直水平视为卷积层。现在让我们决定每层的感受野(F)= 3,填充(P)= 0和步幅(S)= 1。 W 是每层0的数字。因此通过公式:

             W_j+1 = ((W_j - F + 2P)/S +1)

在这种情况下,我们在输入层有7个像素,因此通过使用上面的公式,您可以轻松计算每个上层的层数。现在,如果您在第3层看到名为16的像素,它将从13 14和15接收它的输入,因为F = 3。类似地,13,14和15分别从(8 9 10),(9 10 11)和(10 11 12)获得输入,原因与S = 1和F = 3相同。

同样,8将从(1 2 3)获得输入,9从(2 3 4)获得输入,......,12从(5 6 7)获得输入。

因此,如果你看到w.r.t为16,它将从所有底部7个像素中获得它的输入。

现在使用小型感受野的主要优点是双重的。首先,与使用较大的感受野相比,参数数量较少,而其他我们已将非线性很好地包含在底部7像素的组合中,如果使用大的感受野,这是不可能的。我建议你去检查当然这个令人敬畏的链接(下面)当然是CS231,所有这些都在那里得到了很好的解释。

Convolutional Neural Networks (CNNs/ConvNets)

答案 2 :(得分:0)

我认为@ Aenimated1提供了一个很好的答案。但@chirag提供的链接提供了一个很好的方法来回答。我再次粘贴这里的链接给任何其他来这里的人:

     [1]: http://cs231n.github.io/convolutional-networks/

回答问题的具体摘录是:

  

假设您将三个3x3 CONV层堆叠在一起(当然,其间具有非线性)。在这种布置中,第一CONV层上的每个神经元具有输入体积的3×3视图。第二CONV层上的神经元具有第一CONV层的3×3视图,因此通过扩展获得输入体积的5×5视图。类似地,第三个CONV层上的神经元具有第二个CONV层的3x3视图,因此输入音量为7x7视图。

为了支持这个答案,我发现这篇文章可能非常有用。它回答了有关容器领域的任何疑问:

https://medium.com/@nikasa1889/a-guide-to-receptive-field-arithmetic-for-convolutional-neural-networks-e0f514068807

答案 3 :(得分:0)

假设我们有一个的网络架构,其中包含多个卷积层。对于每个卷积层,我们定义一个平方核大小和一个膨胀率。另外,假设步幅为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] Zhang Kai Kai等。 “除了高斯降噪器之外,还可以对深度cnn进行残差学习以进行图像降噪。” IEEE Transactions on Image Processing 26.7(2017):3142-3155。