卷积层从输入中提取特征后,会生成特征图。这些特征图虽然包含信息,但通常保持较高的空间分辨率(宽度和高度)。在后续层中处理这些大型特征图可能计算成本高昂,并可能使网络对输入中特征的精确位置过于敏感。池化层提供了一种系统地减小特征图空间维度的方法来解决此问题。池化,也称为子采样或降采样,它对特征图局部区域的信息进行概括。它有助于创建更紧凑、对输入图像中的小偏移或失真具有稍强鲁棒性的表示。可以将其视为创建了一个较低分辨率的概要,它保留了前一个卷积层检测到的必要特征。池化工作原理池化操作独立地在每个输入特征图上滑动一个窗口(通常称为池化滤波器或核)。对于窗口的每个位置,它将该窗口内的值聚合成一个单一的输出值。窗口随后根据指定的步幅滑动,类似于卷积。与卷积层不同,池化层通常没有可学习的参数(权重或偏差)。聚合函数(如最大值或平均值)是固定的。这使得它们更简单且计算成本更低。定义池化操作的主要参数有:池化窗口大小: 要聚合区域的维度(高 x 宽)(例如,2x2、3x3)。步幅: 窗口在每一步水平和垂直方向上移动的像素数量。步幅等于窗口大小会导致非重叠的池化区域。填充: 通常,池化层不使用填充(“有效”填充),因为目标是降维。但是,如果需要保持特定的输出维度,有时可以使用“相同”填充,尽管这不太常见。常见的池化类型CNN中常用两种主要类型的池化操作:最大池化最大池化从池化窗口覆盖的特征图区域中选择最大值。操作: 对于每个窗口位置,输出 = $max(区域值)$。理念: 它捕获局部区域内最显著的特征(激活值最高的那个)。这种方法倾向于保留强信号,并在许多分类任务中有效。如果网络在某个区域内检测到强边缘或角点,最大池化会确保该信息被传递。考虑一个4x4输入特征图和步幅为2的2x2最大池化操作:输入特征图: [[ 1, 3, 2, 4], [ 5, 6, 7, 8], [ 9, 0, 1, 2], [ 3, 4, 5, 6]] 池化窗口 (2x2), 步幅 (2) 左上窗口:max(1, 3, 5, 6) = 6 右上窗口:max(2, 4, 7, 8) = 8 左下窗口:max(9, 0, 3, 4) = 9 右下窗口:max(1, 2, 5, 6) = 6 输出特征图 (2x2): [[ 6, 8 ], [ 9, 6 ]]平均池化平均池化计算池化窗口内所有元素的平均值。操作: 对于每个窗口位置,输出 = $average(区域值)$。理念: 它提供了区域中特征的平滑、概括性概要。虽然在分类CNN的中间层中不如最大池化常见,但它在某些架构中或作为全连接层之前减小特征图的最后一步(全局平均池化)时可能有用。使用相同的4x4输入图,步幅为2的2x2平均池化操作将得到:输入特征图: [[ 1, 3, 2, 4], [ 5, 6, 7, 8], [ 9, 0, 1, 2], [ 3, 4, 5, 6]] 池化窗口 (2x2), 步幅 (2) 左上窗口:avg(1, 3, 5, 6) = 15/4 = 3.75 右上窗口:avg(2, 4, 7, 8) = 21/4 = 5.25 左下窗口:avg(9, 0, 3, 4) = 16/4 = 4.00 右下窗口:avg(1, 2, 5, 6) = 14/4 = 3.50 输出特征图 (2x2): [[ 3.75, 5.25 ], [ 4.00, 3.50 ]]全局池化一种变体是全局池化(包括全局最大池化或全局平均池化)。它不使用小窗口,而是将池化操作应用于每个特征图的整个空间维度(宽度和高度)。如果输入特征图的维度为 $H \times W \times C$,全局池化会生成大小为 $1 \times 1 \times C$ 的输出,有效地将每个通道的特征图缩减为一个单一数值。这通常在网络的末端使用,以在送入最终分类层之前大幅减小维度。最大池化可视化这是一个小例子,说明了步幅为2的2x2最大池化操作。digraph G { rankdir=LR; node [shape=plaintext, fontsize=10]; subgraph cluster_input { label = "输入特征图 (4x4)"; bgcolor="#e9ecef"; style=filled; inp [label=< <TABLE BORDER="1" CELLBORDER="1" CELLSPACING="0"> <TR><TD>1</TD><TD bgcolor="#ffc9c9">3</TD><TD>2</TD><TD bgcolor="#ff8787">4</TD></TR> <TR><TD bgcolor="#ffa8a8">5</TD><TD bgcolor="#fa5252">6</TD><TD bgcolor="#ff6b6b">7</TD><TD bgcolor="#f03e3e">8</TD></TR> <TR><TD bgcolor="#f783ac">9</TD><TD>0</TD><TD>1</TD><TD>2</TD></TR> <TR><TD bgcolor="#f06595">3</TD><TD bgcolor="#e64980">4</TD><TD bgcolor="#d6336c">5</TD><TD bgcolor="#be4bdb">6</TD></TR> </TABLE>>]; } subgraph cluster_output { label = "2x2 最大池化 (步幅2) 后的输出"; bgcolor="#e9ecef"; style=filled; out [label=< <TABLE BORDER="1" CELLBORDER="1" CELLSPACING="0"> <TR><TD bgcolor="#fa5252">6</TD><TD bgcolor="#f03e3e">8</TD></TR> <TR><TD bgcolor="#f783ac">9</TD><TD bgcolor="#be4bdb">6</TD></TR> </TABLE>>]; } inp -> out [label=" 最大池化\n (2x2, S=2)", fontsize=10]; }示例:将步幅为2的2x2最大池化操作应用于4x4输入特征图。输出图中的每个值对应于输入中2x2非重叠区域的最大值。在CNN架构中的作用池化层通常插入在连续的卷积层之间(通常在对卷积输出应用激活函数之后)。CNN中的常见模式是:CONV -> ReLU -> POOL -> CONV -> ReLU -> POOL -> ... -> Flatten -> Fully Connected -> Output这种结构允许网络首先学习分层特征(CONV + ReLU),然后周期性地降低空间分辨率,同时保留重要信息(POOL)。这种缩减有助于管理计算负载,并对特征定位的变化建立一定的容忍度。总之,池化是CNN中的一项基本操作,它减小特征图的空间维度,降低计算量,并引入一定程度的平移不变性,与卷积层的特征提取作用相辅相成。最大池化是使用最频繁的变体,因为它在保留强特征激活方面有效。