跳到主要内容

汇聚层(池化层)

汇聚层是什么?

汇聚层(Pooling Layer),也经常被称为下采样层,是卷积神经网络中常用的一种结构。它的主要目的是减少特征图的空间维度,从而减少计算量、参数数量和过拟合的风险。汇聚层通常在连续的卷积层之间使用。

提示

"汇聚层"(Pooling Layer)和"池化层"(Pooling Layer)是同一个概念的两种不同的叫法。在深度学习和卷积神经网络的文献和教材中,这两个术语通常可以互换使用。它们都指的是在卷积神经网络中用于降低特征图空间尺寸的层。

汇聚操作通常是在每个特征图上独立进行的,不改变特征图的数量(即通道数)。

常见的汇聚操作有:

  1. 最大汇聚(Max Pooling):在每个汇聚窗口中取最大值作为输出。
  2. 平均汇聚(Average Pooling):在每个汇聚窗口中取平均值作为输出。

例子

考虑以下 4×44 \times 4 的特征图:

1 3 2 4
5 6 7 8
3 2 1 0
1 2 3 4

如果我们应用 2×22 \times 2 的最大汇聚,步幅为 2,我们将得到以下 2×22 \times 2 的输出:

6 8
3 4

解释:

  • 第一个 2×22 \times 2 窗口中的最大值是 6(包含数字 1, 3, 5, 6)。
  • 第二个 2×22 \times 2 窗口中的最大值是 8(包含数字 2, 4, 7, 8)。
  • 第三个 2×22 \times 2 窗口中的最大值是 3(包含数字 3, 2, 1, 2)。
  • 第四个 2×22 \times 2 窗口中的最大值是 4(包含数字 1, 0, 3, 4)。

在 PyTorch 中使用汇聚层

在 PyTorch 中,您可以使用 nn.MaxPool2dnn.AvgPool2d 来分别实现最大汇聚和平均汇聚。

import torch
import torch.nn as nn

# 定义一个最大汇聚层,池化窗口大小为 2x2,步幅为 2
max_pool = nn.MaxPool2d(kernel_size=2, stride=2)

# 创建一个示例的输入数据
# 批大小为 1
# 通道数为 1
# 图像大小为 4x4
input_data = torch.Tensor([[[[1, 3, 2, 4],
[5, 6, 7, 8],
[3, 2, 1, 0],
[1, 2, 3, 4]]]])

# 应用最大汇聚层
output_data = max_pool(input_data)

print(output_data)

上述代码将输出:

tensor([[[[6., 8.],
[3., 4.]]]])

这与我们手动计算的结果相匹配。

nn.MaxPool2d 实际应用

看下面的代码,nn.MaxPool2d 不是会降低特征数量吗?为什么给下一层的输入还能有 32?

  # 特征提取部分
self.features = nn.Sequential(
# 第一个卷积层:从3个通道 (RGB) 到32个通道
nn.Conv2d(3, 32, kernel_size=3, padding=1),
nn.ReLU(inplace=True), # 使用ReLU作为激活函数
nn.MaxPool2d(kernel_size=2, stride=2), # 最大池化减少空间尺寸
# 第二个卷积层:从32个通道到64个通道
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
# 第三个卷积层:从64个通道到128个通道
nn.Conv2d(64, 128, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
)

首先,理解 nn.MaxPool2d 的作用是非常重要的。nn.MaxPool2d 是一个池化层,它对输入特征图进行下采样,减少其空间尺寸,但不会改变通道数。

具体解释以下几点:

  1. 空间尺寸:当我们说空间尺寸,我们通常指的是特征图的宽度和高度。例如,一个具有 [32, 64, 16, 16] 形状的张量表示有32个样本,每个样本有64个通道,每个通道的空间尺寸是16x16。

  2. 通道数:通道数指的是特征图的深度。在上述张量中,有64个通道。

  3. MaxPool2d的作用nn.MaxPool2d(kernel_size=2, stride=2) 的作用是将输入特征图的空间尺寸减半,但它不会改变通道数。例如,如果输入是 [32, 64, 16, 16],经过池化后,输出会是 [32, 64, 8, 8]

所以,回到问题,当在第一个卷积层后应用 nn.MaxPool2d 时,特征图的通道数不会改变,仍然是32。空间尺寸减半是为了减少计算量和模型的参数数量,同时使模型具有更强的平移不变性。

总之,卷积层负责从输入特征图中提取特征并增加通道数,而池化层则负责减小特征图的空间尺寸但不改变通道数。