卷积核、步长与池化:感受野、参数共享

📂 所属阶段:第二阶段 — 深度学习视觉基础(CNN 篇)
🔗 相关章节:从全连接到卷积 · 经典 CNN 架构剖析


1. 卷积核大小

"""
常见卷积核大小:
  1×1:通道融合
  3×3:最常用,平衡感受野和计算量
  5×5:更大的感受野
  7×7:很少用,计算量大
"""

import torch
import torch.nn as nn

# 不同大小的卷积核
conv1x1 = nn.Conv2d(3, 64, kernel_size=1)
conv3x3 = nn.Conv2d(3, 64, kernel_size=3, padding=1)
conv5x5 = nn.Conv2d(3, 64, kernel_size=5, padding=2)

x = torch.randn(1, 3, 224, 224)
print(f"1×1 输出: {conv1x1(x).shape}")  # (1, 64, 224, 224)
print(f"3×3 输出: {conv3x3(x).shape}")  # (1, 64, 224, 224)
print(f"5×5 输出: {conv5x5(x).shape}")  # (1, 64, 224, 224)

2. 步长(Stride)与填充(Padding)

"""
步长:卷积核每次移动的像素数
  stride=1:每次移动 1 像素
  stride=2:每次移动 2 像素(下采样)

填充:在图像边界添加 0
  padding=0:无填充
  padding=1:添加 1 圈 0
"""

import torch
import torch.nn as nn

x = torch.randn(1, 3, 224, 224)

# stride=1, padding=1 → 输出大小不变
conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)
print(f"stride=1: {conv1(x).shape}")  # (1, 64, 224, 224)

# stride=2, padding=1 → 输出大小减半
conv2 = nn.Conv2d(3, 64, kernel_size=3, stride=2, padding=1)
print(f"stride=2: {conv2(x).shape}")  # (1, 64, 112, 112)

# 输出大小公式:
# output_size = (input_size - kernel_size + 2*padding) / stride + 1

3. 池化(Pooling)

"""
池化:下采样操作,减少特征图大小

最大池化(Max Pooling):取最大值
平均池化(Average Pooling):取平均值
"""

import torch
import torch.nn as nn

x = torch.randn(1, 64, 224, 224)

# 最大池化
max_pool = nn.MaxPool2d(kernel_size=2, stride=2)
print(f"Max Pool: {max_pool(x).shape}")  # (1, 64, 112, 112)

# 平均池化
avg_pool = nn.AvgPool2d(kernel_size=2, stride=2)
print(f"Avg Pool: {avg_pool(x).shape}")  # (1, 64, 112, 112)

4. 感受野(Receptive Field)

"""
感受野:输出特征对应的输入区域大小

计算公式:
  RF = kernel_size + (RF_prev - 1) × stride

例子:
  Layer 1: 3×3 卷积, stride=1 → RF=3
  Layer 2: 3×3 卷积, stride=1 → RF=5
  Layer 3: 3×3 卷积, stride=1 → RF=7
  
  如果加入 stride=2 的池化:
  Layer 1: 3×3 卷积, stride=1 → RF=3
  Layer 2: 2×2 池化, stride=2 → RF=6
  Layer 3: 3×3 卷积, stride=1 → RF=10
"""

# 感受野越大,模型看到的上下文越多
# 但计算量也会增加

5. 小结

卷积层三要素:

1. 卷积核大小:3×3 最常用
2. 步长:stride=1 保持大小,stride=2 下采样
3. 池化:减少参数,增加感受野

感受野:
  - 越大越好?不一定
  - 需要平衡感受野和计算量
  - 通常用多个小卷积核替代大卷积核

💡 记住:两个 3×3 卷积核的感受野 = 一个 5×5 卷积核,但参数更少。


🔗 扩展阅读