← 返回 Day 116 正文

Day 116 · 图解

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 感受野
│ │ └─────────┘     │     │
│ └─────────────────┘     │
└─────────────────────────┘