Day 116 — CNN 卷积神经网络 · 图解
卷积运算过程
输入图像 (5×5) 卷积核 (3×3)
┌───────────────────┐ ┌───────────┐
│ 1 0 1 0 1 │ │ 1 0 1 │
│ 0 1 0 1 0 │ ⊗ │ 0 1 0 │
│ 1 0 1 0 1 │ │ 1 0 1 │
│ 0 1 0 1 0 │ └───────────┘
│ 1 0 1 0 1 │
└───────────────────┘
卷积核在图像上滑动(stride=1):
输出 (3×3)
┌───────────┐
│ 4 3 4 │
步骤 1: 左上角 │ 2 4 3 │
1×1+0×0+1×1 │ 4 3 4 │
+0×0+1×1+0×0 └───────────┘
+1×1+0×0+1×1 = 4
CNN 整体架构
输入: 3×32×32 (RGB)
│
▼ Conv2d(3→32, 3×3) + BN + ReLU
特征图: 32×32×32 ← 每个通道检测一种特征
│
▼ MaxPool2d(2×2)
下采样: 32×16×16 ← 尺寸减半
│
▼ Conv2d(32→64, 3×3) + BN + ReLU
特征图: 64×16×16 ← 更丰富的特征
│
▼ MaxPool2d(2×2)
下采样: 64×8×8
│
▼ Conv2d(64→128, 3×3) + BN + ReLU
特征图: 128×8×8 ← 高级特征
│
▼ MaxPool2d(2×2)
下采样: 128×4×4
│
▼ Flatten: 128×4×4 = 2048
│
▼ Linear(2048→256) + ReLU + Dropout
│
▼ Linear(256→10)
│
▼ 输出: 10 个类别的 logits
BatchNorm 工作原理
输入特征图 (batch=4, channel=3, H=8, W=8)
│
▼ 对每个 channel 分别计算:
│ mean_c = 1/(N×H×W) Σ x[n,c,h,w]
│ var_c = 1/(N×H×W) Σ (x[n,c,h,w] - mean_c)²
│
▼ 归一化:
│ x_hat = (x - mean_c) / √(var_c + ε)
│
▼ 缩放和平移(可学习参数):
│ y = γ × x_hat + β
│
▼ 输出: 同形状,均值≈0,方差≈1
数据增强示例
原始图像 增强版本
┌──────────────┐ ┌──────────────┐
│ 🐱 │ ──→ │ 🐱 (翻转) │ RandomHorizontalFlip
│ 原图 │ │ │
└──────────────┘ └──────────────┘
┌──────────────┐ ┌──────────────┐
│ 🐱 │ ──→ │ 🐱(旋转15°) │ RandomRotation
│ │ │ │
└──────────────┘ └──────────────┘
┌──────────────┐ ┌──────────────┐
│ 🐱 │ ──→ │ 🐱(变亮) │ ColorJitter
│ │ │ │
└──────────────┘ └──────────────┘
每个 epoch 对同一张图应用不同增强 → 等效扩充训练集
感受野(Receptive Field)
Layer 1 (3×3 conv): 感受野 = 3×3
Layer 2 (3×3 conv): 感受野 = 5×5
Layer 3 (3×3 conv): 感受野 = 7×7
更深的网络能看到更大的区域:
┌─────────────────────────┐
│ 1 2 3 4 5 6 7 8 │
│ ┌─────────────────┐ │
│ │ 1 2 3 4 5 │ │ 5×5 感受野
│ │ ┌─────────┐ │ │
│ │ │ 1 2 3 │ │ │ 3×3 感受野
│ │ └─────────┘ │ │
│ └─────────────────┘ │
└─────────────────────────┘