趋近智
如前所述,标准前馈网络独立处理输入特征,因此会丢失图像等数据中内含的空间关系。卷积神经网络通过使用一种称为卷积的特殊操作作为其主要构件来解决此问题。此操作使网络能够识别和检测输入中的局部模式,从而维持空间层级。
卷积操作的中心是滤波器,也称为核。可以将滤波器视为一个小的、可学习的权重矩阵。它的作用是扫描输入数据并识别特定的特征或模式。例如,在图像中,一个滤波器可以学会检测垂直边缘,另一个可以检测水平边缘,还有一个可能对特定的纹理或颜色梯度有强烈反应。
滤波器在空间上通常较小(例如 3x3、5x5 像素),但会延伸到输入体量的完整深度。如果输入是彩色图像(具有红、绿、蓝通道),则滤波器的深度也将为 3。
卷积操作包含系统地将滤波器在输入数据(例如图像或来自前一层的特征图)上滑动。在每个位置,滤波器会覆盖输入的一小块区域。主要计算包含三个步骤:
这个单独计算出的值(总和 + 偏置)表示滤波器在输入中该特定位置的响应。一个强烈的正值表明滤波器旨在识别的特征在该位置强烈存在。
然后,滤波器滑动到下一个位置,该过程重复进行,直到覆盖整个输入。
一个 3x3 的滤波器覆盖输入的一个区域。对应元素相乘,结果求和(加偏置)以在输出特征图中生成一个值。然后滤波器移动到下一个位置。
通过将单个滤波器应用于整个输入所得到的输出是一个 2D 矩阵,称为特征图或激活图。该图中的每个元素代表着滤波器在输入中特定空间位置的响应。高激活值表示滤波器识别出的特征在该位置强烈存在。
通常,一个卷积层会使用多个滤波器(例如 32、64 或更多),每个滤波器初始化不同,从而识别不同的特征。将所有这些滤波器应用于相同的输入体量,会形成一系列 2D 特征图,构成卷积层的输出体量。此输出体量的深度等于所用滤波器的数量。
步幅规定了滤波器在输入上移动时的步长。
选择步幅是一个设计决策,会影响输出的空间维度和计算成本。
当应用滤波器时,尤其是在输入边界附近,输出特征图的尺寸自然会比输入小。此外,输入最边缘的像素被滤波器覆盖的次数少于中心像素,这可能会引起信息丢失。
填充通过在应用卷积之前在输入体量的边界周围添加额外像素(通常值为零)来处理这些问题。
有两种常见的填充策略:
简而言之,卷积操作使用可学习的滤波器扫描输入数据,进行逐元素乘法和求和以生成特征图。这些图显示了特定模式(由滤波器学到)在不同空间位置的存在。滤波器数量、滤波器尺寸、步幅和填充等参数可以控制特征的提取方式以及输出的空间维度。此过程是 CNN 有效处理图像等网格状数据的基础。
这是一个使用 PyTorch 定义 2D 卷积层的简单示例:
import torch
import torch.nn as nn
# 示例:3 通道输入(例如 RGB 图像),批次大小 1
# 输入维度:(批次大小, 通道数, 高度, 宽度)
input_tensor = torch.randn(1, 3, 64, 64)
# 定义一个卷积层
# in_channels=3: 与输入深度(RGB)匹配
# out_channels=16: 我们希望使用 16 个不同的滤波器
# kernel_size=3: 每个滤波器将是 3x3
# stride=1: 滤波器每次移动一个像素
# padding=1: 使用“相同”填充(对于 3x3 核,步幅 1)
conv_layer = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)
# 应用卷积
output_feature_map = conv_layer(input_tensor)
# 打印输出形状
# 输出:torch.Size([1, 16, 64, 64])
# 批次大小 1,16 个特征图(每个滤波器一个),高度 64,宽度 64
# 注意:由于 padding='same' (padding=1) 和 stride=1,高度和宽度保持为 64。
print(output_feature_map.shape)
这种基本操作在多个层中重复进行,让 CNN 能够学到分层特征,从早期层中的简单边缘和纹理发展到后续层中更复杂的物体部分。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造