卷积神经网络(CNN)¶
CNN 用局部连接 + 权值共享处理网格数据(图像等):同一套卷积核在空间上滑动,既省参数又能提取局部模式。
卷积在算什么¶
\[
Y_{i,j} = \sum_{u,v} K_{u,v}\, X_{i+u,\, j+v} + b
\]
| 概念 | 含义 |
|---|---|
| kernel size | 局部窗口,如 3×3 |
| stride | 滑动步长 |
| padding | 边缘补零,控制输出尺寸 |
| dilation | 空洞卷积,扩大感受野 |
输出尺寸(正方形、无 dilation):
\[
H_{out} = \left\lfloor \frac{H_{in} + 2p - k}{s} \right\rfloor + 1
\]
与 MLP 对比¶
| MLP | CNN | |
|---|---|---|
| 连接 | 全连接 | 局部 |
| 参数 | 随分辨率爆炸 | 核共享,与 H×W 基本无关 |
| 归纳偏置 | 弱 | 局部性、一定平移等变性 |
结构脉络¶
LeNet / AlexNet → VGG(堆小核)→ ResNet(残差 \(y=F(x)+x\))→ 现代高效网络。
代码片段¶
import torch.nn as nn
class TinyCNN(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
self.net = nn.Sequential(
nn.Conv2d(3, 32, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2),
nn.Conv2d(32, 64, 3, padding=1), nn.ReLU(),
nn.AdaptiveAvgPool2d(1), nn.Flatten(),
nn.Linear(64, num_classes),
)
def forward(self, x):
return self.net(x)