深度学习:如何计算感受野

感受野(Receptive Field)是卷积神经网络(CNN)中的一个重要概念,用于描述输入图像中的一个像素在输出特征图中影响的区域大小。在设计和理解卷积神经网络时,计算感受野有助于理解网络如何对输入数据进行处理。

计算感受野的方法
单层卷积的感受野

对于一个卷积层,如果我们知道卷积核的大小 ( k ),步幅 ( s ),和填充 ( p ),单层卷积的感受野计算比较简单。对于第 ( i ) 层卷积,感受野可以表示为:
R i = k i + ( R i − 1 − 1 ) × s i Ri = ki + (R{i-1} - 1) \times si Ri=ki+(Ri11)×si
其中:

  • ( R i ) ( R_i ) (Ri) 是第 ( i ) 层的感受野大小
  • ( k i ) ( k_i ) (ki) 是第 ( i ) 层卷积核的大小
  • ( s i ) ( s_i ) (si) 是第 ( i ) 层的步幅
  • ( R i − 1 ) ( R_{i-1} ) (Ri1) 是前一层的感受野大小
多层卷积的感受野

为了计算整个网络的感受野,我们需要从最顶层(靠近输入)开始,逐层往上计算每一层的感受野。考虑网络中的每一层的卷积核大小、步幅和填充。

示例

假设一个简单的卷积神经网络如下:

输入图像大小为 (32 \times 32)

  • 第一层:卷积层,卷积核大小 ( 3 × 3 ) (3 \times 3) (3×3),步幅 1,填充 1
  • 第二层:池化层,池化窗口大小 ( 2 × 2 ) (2 \times 2) (2×2),步幅 2,填充 0
  • 第三层:卷积层,卷积核大小 ( 3 × 3 ) (3 \times 3) (3×3),步幅 1,填充 1

我们计算每一层的感受野:

  • 第0层(输入层),感受野大小 ( 1 × 1 ) (1 \times 1) (1×1)
  • 第1层(第一层卷积层):
    [ R 1 = 3 + ( 1 − 1 ) × 1 = 3 ] [ R_1 = 3 + (1 - 1) \times 1 = 3 ] [R1=3+(11)×1=3]
    感受野大小为 ( 3 × 3 ) (3 \times 3) (3×3)
  • 第2层(池化层):
    [ R 2 = 2 + ( 3 − 1 ) × 2 = 6 ] [ R_2 = 2 + (3 - 1) \times 2 = 6 ] [R2=2+(31)×2=6]
    感受野大小为 ( 6 × 6 ) (6 \times 6) (6×6)
  • 第3层(第二层卷积层):
    [ R 3 = 3 + ( 6 − 1 ) × 1 = 8 ] [ R_3 = 3 + (6 - 1) \times 1 = 8 ] [R3=3+(61)×1=8]
    感受野大小为 ( 8 × 8 ) (8 \times 8) (8×8)
因此,在这个简单的卷积神经网络中,最后一层输出的每一个像素对应输入图像中的一个 ( 8 × 8 ) (8 \times 8) (8×8) 区域。
实际计算例子

让我们通过一个更详细的实际例子来计算一个复杂卷积神经网络的感受野。假设以下是一个卷积神经网络结构:

输入图像大小: ( 224 × 224 ) (224 \times 224) (224×224)
  • 卷积层1:卷积核 ( 7 × 7 ) (7 \times 7) (7×7),步幅 2,填充 3
  • 最大池化层:池化窗口 ( 3 × 3 ) (3 \times 3) (3×3),步幅 2,填充 1
  • 卷积层2:卷积核 ( 3 × 3 ) (3 \times 3) (3×3),步幅 1,填充 1
我们从输入层开始逐层计算:
  • 输入层感受野:1
  • 卷积层1:
    [ R 1 = 7 + ( 1 − 1 ) × 2 = 7 ] [ R_1 = 7 + (1 - 1) \times 2 = 7 ] [R1=7+(11)×2=7]
    感受野大小: ( 7 × 7 ) (7 \times 7) (7×7)
  • 最大池化层:
    [ R 2 = 3 + ( 7 − 1 ) × 2 = 15 ] [ R_2 = 3 + (7 - 1) \times 2 = 15 ] [R2=3+(71)×2=15]
    感受野大小: ( 15 × 15 ) (15 \times 15) (15×15)
  • 卷积层2:
    [ R 3 = 3 + ( 15 − 1 ) × 1 = 17 ] [ R_3 = 3 + (15 - 1) \times 1 = 17 ] [R3=3+(151)×1=17]
    感受野大小: ( 17 × 17 ) (17 \times 17) (17×17)
这个计算过程可以通过一个Python脚本来自动化:
def calculate_receptive_field(layers):
    receptive_field = 1
    for layer in reversed(layers):
        kernel_size, stride, padding = layer
        receptive_field = kernel_size + (receptive_field - 1) * stride
    return receptive_field

# 定义网络的每一层:(卷积核大小,步幅,填充)
layers = [
    (3, 1, 1),  # Conv Layer 2
    (3, 2, 1),  # Max Pooling Layer
    (7, 2, 3)   # Conv Layer 1
]

rf = calculate_receptive_field(layers)
print(f'The receptive field is {rf} x {rf}')

通过这个脚本,可以方便地计算任意复杂网络的感受野。

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

为啥全要学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值