共计 1411 个字符,预计需要花费 4 分钟才能阅读完成。
理解卷积的数学本质
想象用放大镜在图像上滑动检查细节——这就是卷积核的工作方式。2D 卷积的数学表达为:

$$(f * g)(i,j) = \sum_{m}\sum_{n} f(m,n) \cdot g(i-m,j-n)$$
其中 $f$ 是输入图像矩阵,$g$ 是卷积核。动图演示中可以看到,3×3 的卷积核在 5 ×5 输入上滑动时,输出特征图尺寸变为 3 ×3(无 padding 情况下)。
框架选择:PyTorch vs TensorFlow
- PyTorch 优势:
- 动态计算图更直观调试
nn.Conv2d(in_channels, out_channels, kernel_size)参数命名清晰-
与 Python 生态无缝集成
-
TensorFlow/Keras 特点:
Conv2D(filters, kernel_size)参数顺序不同- 静态图模式适合生产部署
- Keras 的
ImageDataGenerator内置数据增强
MNIST 分类实战
import torch
import torch.nn as nn
class CNN(nn.Module):
def __init__(self):
super().__init__()
# 卷积层参数详解:# in_channels=1 (灰度图), out_channels=32 (特征图数量)
# kernel_size=3, stride=1 (默认), padding=1 (保持尺寸)
self.conv1 = nn.Conv2d(1, 32, 3, padding=1)
self.pool = nn.MaxPool2d(2, 2) # kernel_size=2, stride=2
self.fc = nn.Linear(32*14*14, 10) # MNIST 最终 10 分类
def forward(self, x):
x = torch.relu(self.conv1(x))
assert x.shape == (batch_size, 32, 28, 28) # 维度校验
x = self.pool(x)
return self.fc(x.flatten(1))
性能优化关键点
- 计算效率对比:
- 3×3 卷积的 FLOPs:$H \times W \times C_{in} \times C_{out} \times 9$
-
5×5 卷积的 FLOPs 是 3 ×3 的约 2.78 倍
-
BatchNorm 的陷阱:
model.eval() # 必须设置!否则推理时 BN 层仍用 batch 统计量 with torch.no_grad(): output = model(test_data)
新手避坑指南
-
输入归一化:
# 未归一化的像素值 (0-255) 会导致梯度爆炸 transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) # 缩放到[-1,1] ]) -
池化层参数:
- 当
stride > kernel_size时会出现特征图遗漏 - 建议保持
stride <= kernel_size
拓展思考
-
1×1 卷积的妙用:
nn.Conv2d(256, 64, 1) # 将通道数从 256 降到 64 -
转置卷积应用:
nn.ConvTranspose2d(64, 32, 4, stride=2, padding=1) # 分辨率加倍
实践建议
建议先用小批量数据 (如 100 张图) 验证模型基础流程,再逐步增加数据量。学习率初始值可设为 0.01,配合 ReduceLROnPlateau 动态调整。遇到 loss 震荡时,尝试增加 BatchNorm 层或减小学习率。
正文完
