趋近智
卷积神经网络(CNN)将卷积和池化等基本操作组合成典型架构。尽管这些架构可能因具体任务和数据集而有很大差异,但一种常见模式已经形成,特别是对于图像分类问题。
一个标准CNN通常包含两个主要部分:
让我们分解一下流程和组成部分:
输入图像(或其他网格状数据)首先通过一系列卷积层和池化层。
卷积 -> 激活 (ReLU) -> 池化 的这一序列通常形成一个“块”,并且可以堆叠多个这样的块。随着我们网络越靠后(堆叠更多块),卷积层倾向于在早期层检测到的特征基础上,学习日益复杂和抽象的特征。滤波器大小可能保持较小(例如,3x3),但后面层中的滤波器数量通常会增加,使网络能够捕获更广泛的特征种类。
在特征提取堆栈的最后一个池化层之后,得到的特征图通常是3D张量(高 x 宽 x 通道/滤波器数量)。然而,标准全连接层需要1D向量作为输入。因此,会执行一个“展平”操作。这只是简单地将3D特征图重塑为一个单一的、长的1D向量,有效地将所有学习到的特征激活排列起来。
展平后的向量随后被送入一个或多个全连接层。
下图描绘了图像分类的常见CNN结构:
CNN的典型流程:输入图像通过卷积层和池化层进行特征提取。得到的特征图被展平为一个向量,然后由全连接层处理以进行最终分类或回归。
下面展示了如何使用PyTorch的nn.Sequential定义一个类似于上面图示的简单CNN架构:
import torch
import torch.nn as nn
# 假设输入图像是32x32像素,具有3个颜色通道(RGB)
# 并且我们想要分类为10个类别
model = nn.Sequential(
# 特征提取块 1
nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, padding=1), # 输出: 32x32x32
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2), # 输出: 16x16x32
# 特征提取块 2
nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1), # 输出: 16x16x64
nn.ReLU(),
nn.MaxPool2d(kernel_size=2, stride=2), # 输出: 8x8x64
# 展平
nn.Flatten(), # 输出: 8 * 8 * 64 = 4096 个特征
# 分类层
nn.Linear(in_features=8*8*64, out_features=128),
nn.ReLU(),
nn.Linear(in_features=128, out_features=10) # 10个类别的输出层
# 注意: Softmax通常由损失函数(例如,CrossEntropyLoss)隐式应用
)
# 示例用法: 创建一个虚拟输入张量
dummy_input = torch.randn(1, 3, 32, 32) # (批量大小, 通道数, 高度, 宽度)
output = model(dummy_input)
print(output.shape) # 预期输出: torch.Size([1, 10])
这种结构使网络能够学习特征的空间层次结构。早期层检测简单的模式,如边缘和角点,而后面层则将这些模式组合起来,识别与最终任务更复杂的结构。池化层具有稳定性并减少计算负担,而全连接层则整合学习到的特征进行预测。
这部分内容有帮助吗?
nn.Sequential 模块及相关层(如 Conv2d、MaxPool2d、Flatten 和 Linear)的官方文档,用于构建CNN。© 2026 ApX Machine Learning用心打造