卷积神经网络5-深度学习中的汇聚层:原理与应用

在深度学习中,图像处理是一个至关重要的任务,而卷积神经网络(CNN)则是实现这一任务的主力模型之一。CNN的核心组成部分包括卷积层、汇聚层(Pooling layer) 以及全连接层等。在这些层中,汇聚层的作用尤为关键,它帮助我们降低数据的空间维度,提取重要特征,同时减轻模型对位置变化的敏感性。本篇博客将深入讲解汇聚层的基本概念、常见类型及其应用,帮助你更好地理解这一重要技术(需要注意的是,“汇聚层”和“池化层”指的是同一个概念的不同翻译,功能完全相同。两者都通过对图像局部区域的汇总来减少空间维度,增强模型的平移不变性)。

1. 汇聚层概述

在图像处理中,我们希望通过神经网络逐步提取图像的高级特征。为了达到这一目标,我们通常会逐渐减小图像的空间分辨率,并将输入图像的局部信息合并,从而生成越来越粗糙的表示。汇聚层正是实现这一目标的关键组件之一。
汇聚层的主要功能是通过对图像的局部区域进行统计,减少空间维度,并提高模型的平移不变性。也就是说,汇聚层能帮助模型忽略图像中微小的位移或变化,使得模型能够更加稳定地识别出物体。

2. 最大汇聚层与平均汇聚层

汇聚层的工作方式与卷积层类似。卷积层通过卷积核对输入图像进行运算,而汇聚层则通过固定大小的窗口对输入进行滑动,并计算该窗口内的最大值或平均值。根据计算方式的不同,汇聚层可以分为两种类型:

2.1 最大汇聚层(Max Pooling)

最大汇聚层的操作是:在每个窗口内选择最大值作为输出。这意味着,每当汇聚窗口滑动到图像的一个位置时,它将取该窗口内所有元素中的最大值,并将其作为输出。
例如,考虑一个大小为2×22×22×2的汇聚窗口,如果窗口中的元素是[1,2,3,4][1, 2, 3, 4][1,2,3,4],则最大汇聚层的输出是444。

2.2 平均汇聚层(Average Pooling)

与最大汇聚层不同,平均汇聚层会计算每个汇聚窗口中元素的平均值,并将其作为输出。比如,对于同样的2×22×22×2窗口[1,2,3,4][1, 2, 3, 4][1,2,3,4],平均汇聚层的输出是2.52.52.5。
2.3 数学公式

  • 最大汇聚层: 对于一个给定的输入矩阵X,窗口大小为ph×pw,则最大汇聚层的输出Y可以表示为:


    82390a6b-2888-4aa4-af51-33dc6aee088e.png
  • 平均汇聚层: 对于平均汇聚层,输出Y可以表示为


    8e6de7a7-cd0d-4668-86f6-08c3287a3774.png

3. 汇聚层的应用

汇聚层在卷积神经网络中具有多重作用,最常见的应用包括:

  • 降维与特征聚合: 汇聚层能够有效减少数据的空间维度,从而减少计算量,避免过拟合,并且使得模型更加高效。
  • 增强平移不变性: 通过最大或平均池化,汇聚层减少了卷积层对位置变化的敏感性。例如,移动图像中的物体位置不会对汇聚层的输出造成太大影响,从而增强了模型对平移的鲁棒性。

4. 填充和步幅

与卷积层类似,汇聚层的输出形状也可以通过填充(Padding)和步幅(Stride)来控制。填充是指在输入数据的边缘添加额外的像素,步幅则是指窗口滑动的步长。通过合理设置填充和步幅,我们可以调节输出的大小。
例如,如果使用大小为3×33 \times 33×3的汇聚窗口,步幅为1,那么输出的尺寸将比输入大约小1个单位。如果步幅为2,输出的尺寸将进一步缩小。

4.1 示例

我们通过以下代码示例来演示汇聚层的应用:

import torch
from torch import nn

# 构造一个4x4的输入张量
X = torch.arange(16, dtype=torch.float32).reshape((1, 1, 4, 4))
print(X)

# 使用最大汇聚层,窗口大小为3x3,步幅为1
pool2d = nn.MaxPool2d(kernel_size=3, stride=1)
output = pool2d(X)
print(output)

输出结果:

tensor([[[[ 0.,  1.,  2.,  3.],
          [ 4.,  5.,  6.,  7.],
          [ 8.,  9., 10., 11.],
          [12., 13., 14., 15.]]]])
tensor([[[[10., 11.],
          [14., 15.]]]])

4.2 填充与步幅的设置

我们还可以手动设置填充和步幅的大小:

# 设置填充为1,步幅为2
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
print(pool2d(X))

输出结果:

tensor([[[[ 5.,  7.],
          [13., 15.]]]])

5. 多通道输入

在处理多通道输入(例如RGB图像)时,汇聚层会分别对每个通道进行操作,而不是像卷积层一样对所有通道的输入进行汇总。这意味着,汇聚层的输出通道数与输入通道数相同。

5.1 示例

# 构造一个包含2个通道的输入张量
X = torch.cat((X, X + 1), dim=1)
print(X.shape)
print(X)

# 使用最大汇聚层处理2通道输入
pool2d = nn.MaxPool2d(3, padding=1, stride=2)
print(pool2d(X))

输出结果:

torch.Size([1, 2, 4, 4])
tensor([[[[ 0.,  1.,  2.,  3.],
          [ 4.,  5.,  6.,  7.],
          [ 8.,  9., 10., 11.],
          [12., 13., 14., 15.]],

         [[ 1.,  2.,  3.,  4.],
          [ 5.,  6.,  7.,  8.],
          [ 9., 10., 11., 12.],
          [13., 14., 15., 16.]]]])
tensor([[[[ 5.,  7.],
          [13., 15.]],

         [[ 6.,  8.],
          [14., 16.]]]])

6. 小结

通过本文的学习,我们了解了汇聚层的基本概念及其在卷积神经网络中的作用。汇聚层不仅可以降低数据的空间维度,减少计算量,还能够提高模型对平移变化的鲁棒性。我们还讨论了最大汇聚层与平均汇聚层的区别,以及如何使用填充和步幅控制输出形状。在处理多通道输入时,汇聚层会对每个通道独立进行运算。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容