卷积神经网络(Convolutional Neural Networks) #
卷积神经网络(CNN)的必要性在于它能够高效地处理具有高维结构的数据,特别是图像数据。在处理如图像这样的高维感知数据时,传统的多层感知机(MLP)存在局限性,因为它没有考虑到数据中的空间结构,导致在图像分类等任务中,参数量和计算开销巨大,训练起来非常不实用。举例来说,在猫狗图片分类任务中,使用百万像素的图像作为输入时,全连接层将产生数量庞大的参数,这不仅需要大量的计算资源,还可能导致过拟合。因此,卷积神经网络通过局部连接和权重共享的方式有效减少了参数数量,利用图像本身的空间结构进行特征提取,使得网络能够在较少的参数下仍能有效学习图像中的模式和特征。这种方式不仅极大地减少了计算复杂度,还能在图像处理任务中取得显著的性能提升。
从全连接层到卷积(From FC Layer to Convolutional) #
想象一下,假设我们想从一张图片中找到某个物体。 合理的假设是:无论哪种方法找到这个物体,都应该和物体的位置无关。卷积神经网络正是将 空间不变性(spatial invariance) 的这一概念系统化,从而基于这个模型使用较少的参数来学习有用的表示。
- 什么是不变性? 不变性是指模型对某些输入变化(如平移、旋转、缩放等)保持输出的一致性。例如,图像中的物体移动、缩放不应影响分类结果。
- 为什么不变性重要?
- 现实场景中的数据变化: 如图像中的摄像机角度、光线、物体位置变化。
- 提升泛化能力: 通过不变性,模型能够适应更多样化的输入数据。
卷积(Convolution)引入了三个重要的概念,这些概念极大地提升了机器学习系统的效率和性能:稀疏交互(sparse interactions)、参数共享(parameter sharing)以及等变表示(equivariant representations)。此外,卷积还为处理可变大小的输入提供了有效的方法。
稀疏交互(Sparse Interactions):
在传统的全连接神经网络中,每个输入单元都与每个输出单元直接相连,这种完全连接的结构会导致参数数量巨大且计算量庞大。而卷积通过使用卷积核(kernel)仅与局部区域交互,大大减少了连接的数量。这种稀疏交互能够显著降低计算复杂度,同时保留局部特征的关键信息。例如, \(3 \times 3\) 的卷积核只需与输入图像的一小部分进行操作,而不是整个图像。
参数共享(Parameter Sharing):
在卷积操作中,卷积核的权重在整个输入中是共享的。这意味着,同一个卷积核在输入图像的不同位置应用相同的权重,从而大幅减少了参数数量。这种共享机制不仅降低了模型复杂度,还提高了模型的泛化能力,因为共享的卷积核能够捕获输入中的通用模式(如边缘、角点等)。
等变表示(Equivariant Representations):
卷积具有平移等变性(translation equivariance),这意味着如果输入发生平移,卷积操作的输出会以相应方式平移。这种特性非常适合处理图像等感知数据,因为目标的空间位置可能会有所变化,但其本质特征保持不变。等变性使得模型能够在不同位置识别相同的模式,从而增强了模型的鲁棒性。
支持可变大小输入(Variable Size Inputs):
卷积操作可以灵活地处理不同尺寸的输入。这是因为卷积核是基于局部区域滑动的,不依赖输入的绝对尺寸。例如,无论输入图像是 \(128 \times 128\) 还是 \(256 \times 256\) ,卷积核都可以逐步滑动并提取特征。这种能力使卷积神经网络非常适合处理变长或变形的数据,如图片、音频或序列信号。
多层感知机(MLP)的限制 #
- 平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。例如,图像中的一只猫无论位于左上角还是右下角,模型都应能够正确识别。
- MLP的局限性:
- 完全连接的结构:在MLP中,每个神经元与所有输入特征相连,因此模型对输入的每个像素赋予独立的权重。换句话说,特定像素的特征无法被直接用于识别全局的物体特征。如果输入图像中的物体位置发生平移,输入像素值会重新映射到不同的神经元,导致特征表示的变化。
- 缺乏空间归纳偏置:MLP无法内嵌有关输入空间结构的先验知识(如相邻像素间的关系),因此需要依赖大量数据学习这些模式。
- 影响:
- MLP对图像特征的空间位置高度敏感,难以通过有限数据泛化到不同的物体位置。
- 模型需要对每种可能的位置分别学习特征表示,这导致数据需求和计算开销成倍增加。
- MLP的局限性:
- 局部性(locality):局部性是指数据中的局部区域通常具有更强的相关性,例如图像中相邻像素往往属于同一物体或边缘。
- MLP的局限性:
- 忽略局部相关性:MLP的每个神经元对整个输入空间具有感知能力,但无法重点关注局部区域的特征交互。例如,在图像中,MLP无法直接识别相邻像素构成的边缘或纹理。这种全局感知的特性导致模型在提取局部模式(如边缘或角点)时效率低下。
- 参数冗余:MLP为每个输入特征分配独立的权重,因此即使相邻像素之间存在高度相关性,模型仍需单独学习这些特征,造成参数冗余和过拟合风险。
- 影响:
- MLP难以捕捉高维数据中的局部模式,尤其是在输入维度较高时(如图像或语音)。
- 局部特征无法有效提取,导致模型在特征表达能力上不足。
- MLP的局限性:
图像卷积(Convolutions for Images) #
卷积(Convolution)是卷积神经网络(CNN)的核心操作,用于 从输入数据(如图像)中提取特征模式。
互相关操作(The Cross-Correlation Operation) #
虽然卷积层得名于 卷积(Convolution) 运算,但我们通常在卷积层中使用更加直观的 互相关(Cross-correlation) 运算。互相关是一种滑动窗口操作,它通过 核(kernel,或称 filter) 在输入上移动并计算点积来提取局部特征。
在二维卷积层中,一个二维输入数组和一个二维 核(kernel) 数组通过互相关运算输出一个二维数组。如下图所示,输入是一个高和宽均为 3 的二维数组。我们将该数组的形状记为 \(3\times 3\) 。核数组的高和宽分别为 2。该数组在卷积计算中又称 卷积核 或 过滤器(filter)。卷积核窗口(又称卷积窗口)的形状取决于卷积核的高和宽,即 \(2 \times 2\) 。图中的阴影部分为第一个输出元素及其计算所使用的输入和核数组元素: \(0×0+1×1+3×2+4×3=19\) 。

在二维互相关运算中,卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组中相应位置的元素。图中的输出数组高和宽分别为 2,其中的 4 个元素由二维互相关运算得出:
\[ 0\times0+1\times1+3\times2+4\times3=19,\\ 1\times0+2\times1+4\times2+5\times3=25,\\ 3\times0+4\times1+6\times2+7\times3=37,\\ 4\times0+5\times1+7\times2+8\times3=43. \]- 互相关操作代码实现
# 自定义二维互相关操作 def corr2d(X, K): """二维互相关操作""" ## 获取卷积核的高度和宽度 h, w = K.shape ## 初始化输出特征图,大小与输入和核的尺寸相关 Y = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1)) for i in range(Y.shape[0]): for j in range(Y.shape[1]): # 计算局部区域与卷积核的点积 Y[i, j] = (X[i:i + h, j:j + w] * K).sum() return Y ## 返回卷积结果
卷积层(Convolutional Layers) #

在卷积神经网络(CNN)中,卷积核(kernel)中的权重(weight)是我们训练过程中需要优化的参数。实际中,我们并不是手动设计固定的卷积核,而是通过训练优化这些权重,使得卷积核能够提取最适合任务的特征。
- 卷积层(Convolutional Layers)代码实现
import torch from torch import nn # 自定义2D卷积层 class Conv2D(nn.Module): def __init__(self, kernel_size): super().__init__() # 定义卷积核的权重,并将其作为可学习参数 ## 卷积核参数,随机初始化,形状由 kernel_size 决定 self.weight = nn.Parameter(torch.rand(kernel_size)) # 定义偏置项,并将其作为可学习参数 self.bias = nn.Parameter(torch.zeros(1)) def forward(self, x): # 将输入与权重进行互相关计算,并加上偏置项 return corr2d(x, self.weight) + self.bias ## 调用自定义的二维互相关操作函数
利用学习卷积核实现图像边缘检测 #
在图像处理中,边缘检测是提取对象轮廓和结构信息的关键操作。通过卷积运算,卷积核(也称为滤波器)能够捕捉图像的局部变化,例如亮度或颜色的快速变化,这通常对应于边缘。手工设计的卷积核可以实现简单的边缘检测,例如通过水平或垂直边缘检测器来突出特定方向的边缘。然而,更灵活的方法是通过学习卷积核,使其能够适应复杂的数据分布和任务需求。
在深度学习中,卷积神经网络(CNN)通过反向传播算法自动优化卷积核的参数,使其能够提取最有利于目标任务的特征。以边缘检测为例,通过初始化卷积核并利用标注数据训练网络,模型可以逐渐学习到如何识别边缘,并适配不同的图像特性。这种学习过程不仅提高了检测的准确性,还可以扩展到更高级的特征提取任务,如纹理、形状和物体识别。
- 初始化:核的参数通常随机初始化。
- 前向传播:使用当前的核参数计算输出特征图。
- 反向传播:根据损失对核参数计算梯度。
- 参数更新:使用优化算法(如 SGD 或 Adam)调整核的权重。
当图像输入到CNN中时,图像被分成多个小的局部区域(通常是由卷积核的大小决定的),这些局部区域与卷积核进行互相关操作。通过这种方式,卷积核可以在图像中滑动,并生成一张特征图(feature map),该特征图包含了图像中不同位置的特征响应。通过反向传播优化权重,卷积核能够逐步学习到如何从图像中提取有意义的特征,如边缘、角点、纹理等。
特征映射和感受野(Feature Map and Receptive Field) #
Feature Map(特征图):
- 特征图是卷积操作的输出,每个特征图表示输入数据中一个特定的模式或 特征(如边缘、纹理)。
- 多个卷积核生成多个特征图,以捕获输入中的多样性信息。
Receptive Field(感受野):
- 感受野是指特定神经元在输入空间中“看到”的区域。
- 初始卷积核的感受野大小等于其尺寸,每层操作都会扩大感受野,具体由核大小、步幅和填充共同决定。多层网络中,靠后的神经元感受野更大,能够捕获更全局的模式。
- 感受野的大小决定了网络捕获全局模式的能力。在分类任务中,充分大的感受野可以确保模型关注到整个输入图像的关键信息。

二维卷积层输出的二维数组可以看作是输入在空间维度(宽和高)上某一级的表征,也叫 特征图(feature map)。影响元素 \(x\) 的前向计算的所有可能输入区域(可能大于输入的实际尺寸)叫做 \(x\) 的 感受野(receptive field)。以下图为例,输入中阴影部分的四个元素是输出中阴影部分元素的感受野。我们将形状为 \(2×2\) 的输出记为 \(Y\) ,并考虑一个更深的卷积神经网络:将 \(Y\) 与另一个形状为 \(2×2\) 的核数组做互相关运算,输出单个元素 \(z\) 。那么, \(z\) 在 \(Y\) 上的感受野包括 \(Y\) 的全部四个元素,在输入上的感受野包括其中全部 9 个元素。可见,我们可以通过更深的卷积神经网络使特征图中单个元素的 感受野变得更加广阔,从而捕捉输入上更大尺寸的特征。

填充(Padding) #
在卷积神经网络中,填充(padding)是处理输入图像边缘像素丢失问题的重要技巧,尤其是当连续应用多个卷积层时,图像尺寸的逐渐减小会影响特征的提取。通过在输入的边界添加额外像素(通常为零),填充可以增加图像的有效尺寸,从而保留边缘信息,改善模型性能。
下图我们在原输入高和宽的两侧分别添加了值为 0 的元素,使得输入高和宽从 3 变成了 5,并导致输出高和宽由 2 增加到 4。图中的阴影部分为第一个输出元素及其计算所使用的输入和核数组元素: \(0×0+0×1+0×2+0×3=0\) 。

一般来说,假设输入形状是 \(n_{h}×n_{w}\) ,卷积核窗口形状是 \(k_{h}×k_{w}\) ,那么输出形状将会是: \((n_{h}-k_{h}+1)×(n_{w}-k_{w}+1)\) 。如果在高的两侧一共填充 \(p_{h}\) 行,在宽的两侧一共填充 \(p_{w}\) 列,那么输出形状将会是
\[ (n_{h}−k_{h}+p_{h}+1)×(n_{w}−k_{w}+p_{w}+1) \]也就是说,输出的高和宽会分别增加 \(p_{h}\) 和 \(p_{w}\) 。
在很多情况下,我们会设置 \(p_{h}=k_{h}−1\) 和 \(p_{w}=k_{w}−1\) 来使输入和输出具有相同的高和宽。这样会方便在构造网络时推测每个层的输出形状。假设这里 \(k_{h}\) 是奇数,我们会在高的两侧分别填充 \(p_{h}/2\) 行。如果 \(k_{h}\) 是偶数,一种可能是在输入的顶端一侧填充 \(⌈p_{h}/2⌉\) 行,而在底端一侧填充 \(⌊p_{h}/2⌋\) 行。在宽的两侧填充同理。
步幅(Stride) #
在之前提到的二维互相关运算中,卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。我们将每次滑动的行数和列数称为 步幅(Stride)。跨步卷积往往能够帮助大幅降低维数。
目前我们看到的例子里,在高和宽两个方向上步幅均为 1。我们也可以使用更大步幅。下图展示了在高上步幅为 3、在宽上步幅为 2 的二维互相关运算。可以看到,输出第一列第二个元素时,卷积窗口向下滑动了 3 行,而在输出第一行第二个元素时卷积窗口向右滑动了 2 列。当卷积窗口在输入上再向右滑动 2 列时,由于输入元素无法填满窗口,无结果输出。图中的阴影部分为输出元素及其计算所使用的输入和核数组元素: \(0×0+0×1+1×2+2×3=8\) 、 \(0×0+6×1+0×2+0×3=6\) 。

一般来说,当高上步幅为 \(s_{h}\) ,宽上步幅为 \(s_{w}\) 时,输出形状为:
\[ ⌊(n_{h}−k_{h}+p_{h}+s_{h})/s_{h}⌋×⌊(n_{w}−k_{w}+p_{w}+s_{w})/s_{w}⌋ \]如果设置 \(p_{h}=k_{h}−1\) 和 \(p_{w}=k_{w}−1\) ,那么输出形状将简化为 \(⌊(n_{h}+s_{h}−1)/s_{h}⌋×⌊(n_{w}+s_{w}−1)/s_{w}⌋\) 。更进一步,如果输入的高和宽能分别被高和宽上的步幅整除,那么输出形状将是 \((n_{h}/s_{h})×(n_{w}/s_{w})\) 。
多输入通道和多输出通道(Multiple Input and Multiple Output Channels) #
多输入通道(Multiple Input Channels) #
多输入通道通常用于处理具有多个特征维度的数据,例如彩色图像的红色、绿色和蓝色(RGB)通道。输入图像的每个像素不仅用二维的空间位置(高度和宽度)表示,还需要包含多个颜色通道的信息,这一维称为 通道(channel)。。因此,输入是一个三维张量,其形状为 \((C_{\text{in}}, H, W)\) ,其中:
- \(C_{\text{in}}\) :输入的通道数。
- \(H, W\) :输入的高度和宽度。
对于每个输入通道,卷积核具有一个独立的权重矩阵。这些权重矩阵与对应的输入通道进行逐像素的加权求和,最后将所有输入通道的结果相加,形成单个二维特征图。对于输入张量 \(\mathbf{X} \in \mathbb{R}^{C_{\text{in}} \times H \times W}\) ,卷积核权重为 \(\mathbf{W} \in \mathbb{R}^{C_{\text{in}} \times k_h \times k_w}\) ,偏置为 \(b \in \mathbb{R}\) ,输出特征图的某个位置 \((i, j)\) 由以下公式计算: \[ Y[i, j] = \sum_{c=1}^{C_{\text{in}}} \sum_{p=1}^{k_h} \sum_{q=1}^{k_w} X[c, i+p, j+q] \cdot W[c, p, q] + b \]
下图展示了含 2 个输入通道的二维互相关计算的例子。在每个通道上,二维输入数组与二维核数组做互相关运算,再按通道相加即得到输出。图中阴影部分为第一个输出元素及其计算所使用的输入和核数组元素: \[ (1×1+2×2+4×3+5×4)+(0×0+1×1+3×2+4×3)=56 \]

当输入通道有多个时,因为我们对各个通道的结果做了累加,所以不论输入通道数是多少,输出通道数总是为 1。
多输出通道(Multiple Output Channels) #
多输出通道用于在隐藏层中生成多个特征图(feature maps),每个特征图捕捉不同的特征模式,例如边缘、纹理或特定对象形状。输出特征图也以三维张量表示,其形状为 \((C_{\text{out}}, H_{\text{out}}, W_{\text{out}})\) ,其中:
- \(C_{\text{out}}\) :输出通道数。
- \(H_{\text{out}}, W_{\text{out}}\) :输出特征图的高度和宽度。
每个输出通道对应一个独立的卷积核组,每组卷积核与所有输入通道进行卷积并求和。因此,卷积层通过学习不同的卷积核来生成多个输出通道,每个输出通道表示不同的特征。对于输出通道 \(o\) ,卷积结果为: \[ Y_o[i, j] = \sum_{c=1}^{C_{\text{in}}} \sum_{p=1}^{k_h} \sum_{q=1}^{k_w} X[c, i+p, j+q] \cdot W[o, c, p, q] + b[o] \]
其中, \(W[o, c, p, q]\) 是第 \(o\) 个输出通道和第 \(c\) 个输入通道对应的权重, \(b[o]\) 是第 \(o\) 个输出通道的偏置。
在卷积过程中,单个卷积核会处理所有的输入通道,并将其加权求和,生成一个单独的输出特征图。所以不论输入通道多少,对于单个卷积核累加输出通道数总是为 1。为了增加输出通道数,可以通过增加卷积核组的数量来实现。如果我们使用 N 个卷积核,就可以生成 N 个输出通道。
结合多输入和多输出通道 #
如果输入有 \(C_{\text{in}}\) 个通道,输出有 \(C_{\text{out}}\) 个通道,那么卷积核的权重形状为: \[ \mathbf{W} \in \mathbb{R}^{C_{\text{out}} \times C_{\text{in}} \times k_h \times k_w} \] 这意味着每个输出通道对应一组卷积核,这组卷积核与所有输入通道进行卷积,并将结果求和生成该输出通道的特征图。这种设计允许网络在不同输出通道中捕获多种特征,从而更好地描述输入数据。
- 假设输入有 \(C_{\text{in}}\) 个通道,我们可以定义 \(C_{\text{out}}\) 个卷积核。
- 每个卷积核的权重形状为 \((C_{\text{in}}, k_h, k_w)\) 。
- 卷积操作会将输入张量形状从 \((C_{\text{in}}, H, W)\) 转换为输出张量形状 \((C_{\text{out}}, H_{\text{out}}, W_{\text{out}})\) 。
Note: 虽然卷积层通常被叫做 N x N 卷积,但是实际他是一个四维的权重矩阵,连接输入和输出的通道数(C_in x N x N x C_out)。
1×1 卷积层 #
\(1×1\) 卷积层是一种特殊的卷积层,其中卷积核的大小为 \(1×1\) 。虽然核的尺寸小,它在卷积神经网络中具有广泛的应用和重要的作用,能够高效地处理输入通道的特征并优化模型结构。 \(1×1\) 卷积核操作的核心是:
- 对输入的每个像素位置,仅对通道维度进行线性组合,而不会涉及空间范围。
- 输入的每个通道的值会被乘以对应卷积核权重后求和,并添加偏置。
因为使用了最小窗口, \(1×1\) 卷积失去了卷积层可以识别高和宽维度上相邻元素构成的模式的功能。实际上, \(1×1\) 卷积的主要计算发生在通道维上。下图展示了使用输入通道数为 3、输出通道数为 2 的 \(1×1\) 卷积核的互相关计算。值得注意的是,输入和输出具有相同的高和宽。输出中的每个元素来自输入中在高和宽上相同位置的元素在不同通道之间的按权重累加。假设我们将通道维当作特征维,将高和宽维度上的元素当成数据样本,那么 \(1×1\) 卷积层的作用与全连接层等价。
Note: 1 x 1 卷积层的权重矩阵为 C_in x 1 x 1 x C_out。对于图像的单个像素位置,每个像素有 C_in 个通道,对应每一个通道上的 weight。空间维度(高和宽)上的每个元素相当于样本,通道相当于特征,因此这相当于一个线形的组合(w1x1+w2x2+…)。根据输出通道的需求可以调整卷积核的组数来实现。**

1×1 卷积层的主要作用 #
- 通道维度的特征变换
- \(1×1\) 卷积核可以在不改变输入空间分辨率(即高和宽)的情况下,通过加权求和实现输入通道的重新组合,提取新的特征。
- 它本质上是一个逐像素的全连接层,作用于每个像素位置上的所有输入通道。
- 降维与升维
- 通过减少输出通道数, \(1×1\) 卷积可以实现特征图的降维,从而减少计算量和参数数量。
- 通过增加输出通道数,它可以进行特征扩展,为后续卷积层提供更丰富的特征。
- 跨通道交互
- 常规的卷积核会处理空间和通道上的信息,但无法高效地在通道维度间进行交互。 \(1×1\) 卷积则专注于通道间的关系建模,有助于提取新的特征表示。
1x1 卷积的核心在于对单个像素位置的所有通道元素进行线性组合。它不涉及空间范围的操作,只在每个像素格的通道维度上进行计算。通过控制1x1卷积核组的数量,我们可以达到降维与升维的效果,并在通道维度间进行交互(如红色、绿色和蓝色三个通道之间)
池化层(Pooling) #
池化层的作用是逐渐降低隐藏表示的空间分辨率并聚合信息,这样随着神经网络层级的增加,每个神经元对更大范围的输入(感受野)变得敏感。池化层帮助神经网络在最后一层聚焦于全局特征(如“图像是否包含猫”)。通过逐渐聚合信息,生成越来越粗糙的映射,最终实现学习全局表示的目标,同时将卷积图层的所有优势保留在中间层。
池化层还通过减少位置敏感性,提升网络对物体平移等变换的鲁棒性。例如,图像的小范围平移(如向右移动一个像素)可能不会影响网络的输出。这样,池化不仅帮助提取底层特征,还增强了模型对小变动(如图像移动或拍摄角度变化)的不变性。
最大池化层和平均池化层(Maximum Pooling and Average Pooling) #
同卷积层一样,池化层每次对输入数据的一个固定形状窗口(又称 池化窗口(pooling window))中的元素计算输出。不同于卷积层里计算输入和核的互相关性,池化层直接计算池化窗口内元素的最大值或者平均值。该运算也分别叫做 最大池化(maximum pooling) 或 平均池化(average pooling)。在二维最大池化中,池化窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当池化窗口滑动到某一位置时,窗口中的输入子数组的最大值即输出数组中相应位置的元素。

上图展示了池化窗口形状为 \(2×2\)
的最大池化,阴影部分为第一个输出元素及其计算所使用的输入元素。输出数组的高和宽分别为 2,其中的 4 个元素由取最大值运算 max
得出:
平均池化的工作原理与最大池化类似,但将最大运算符替换成平均运算符。由于我们正在组合来自多个相邻像素的信息,因此我们可以对相邻像素进行平均以获得具有更好信噪比的图像。池化窗口形状为 \(p×q\) 的池化层称为 \(p×q\) 池化层,其中的池化运算叫作 \(p×q\) 池化。
在物体边缘检测的例子中,我们现在将卷积层的输出作为 \(2×2\) 最大池化的输入。设该卷积层输入是 \(X\) 、池化层输出为 \(Y\) 。无论是 \(X[i, j]\) 和 \(X[i, j+1]\) 值不同,还是 \(X[i, j+1]\) 和 \(X[i, j+2]\) 不同,池化层输出均有 \(Y[i, j]=1\) 。也就是说,使用 \(2×2\) 最大池化层时,只要卷积层识别的模式在高和宽上移动不超过一个元素,我们依然可以将它检测出来。
填充,步幅以及多通道(Padding, Stride, and Multiple Channels) #
同卷积层一样,池化层也可以在输入的高和宽两侧的填充并调整窗口的移动步幅来改变输出形状。池化层填充和步幅与卷积层填充和步幅的工作机制一样。窗口的高度和宽度决定了局部区域的范围(如 \(2 \times 2\) 、 \(3 \times 3\) )。步幅较小,则池化后的输出较大。步幅较大,则池化后的输出较小。填充决定了是否在输入边界填充像素。
在处理多通道输入数据时,池化层对 每个输入通道分别池化,而不是像卷积层那样将各通道的输入按通道相加。这意味着池化层的输出通道数与输入通道数相等。
池化操作不会改变通道数,但会减小空间维度,因此池化操作有效地减少了特征图的总数据量。
池化的主要作用 #
池化层的主要作用是通过下采样(downsampling)来减少输入数据的空间维度,降低计算复杂度,并增强特征的平移不变性。具体来说,池化的作用体现在以下几个方面:
降低计算量和内存消耗:
通过减少特征图的空间维度(高度和宽度),池化层减小了后续卷积层需要处理的输入数据量。这不仅降低了计算复杂度,还减少了模型所需的内存和存储空间。池化通常使用较小的窗口(如2x2或3x3),并且使用步长(stride)跳跃地遍历输入图像,减小特征图的尺寸。
增加平移不变性:
池化层通过聚合局部区域的信息,使得小的平移、旋转或者尺度变化对输出结果的影响减小。例如,如果一个物体从图像的一个区域移动到另一个区域,池化操作会使得相邻区域的特征聚合,而不太依赖于精确的空间位置。
突出显著特征:
池化操作通过选择区域中的最大值(最大池化)或平均值(平均池化),能够保留图像中最显著的特征。例如,在最大池化中,池化窗口中最大的像素值代表该区域最显著的特征,而小的细节(如噪声)则被抑制。这有助于模型聚焦于重要的高层次特征,而忽略低层次的细节。
减少过拟合:
通过池化,网络的参数量减少了,从而降低了模型的复杂度。较少的参数意味着网络更不容易过拟合。池化通过降低特征图的分辨率,减少了网络对训练数据的过度依赖,使得模型能够更好地泛化到未见过的数据。
促进层次特征学习:
由于池化使得网络更关注局部区域的汇总信息,它有助于学习更具层次性的特征。在卷积神经网络的不同层中,较底层的卷积层通常会学习到简单的特征(如边缘和纹理),而较高层的卷积层则会聚焦于更复杂的特征(如物体部分和整体形状)。池化通过逐层下采样,帮助网络逐步汇总和聚焦更抽象的层次特征。