深度学习中的卷积层、池化层、全连接层

25 阅读3分钟

1. 卷积层 —— 特征扫描仪

工作原理

nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)  # 类似用5x5的放大镜扫描图片
  • 比喻:想象你在用放大镜(卷积核)逐块检查快递单号(图片),每个放大镜负责识别一种特征(如数字的横线、竖线)

  • 作用

    • ✅ 提取局部特征(边缘、纹理)
    • ✅ 参数共享(同一放大镜扫描全图)
  • 参数选择

    • 通道数:从6(简单特征)到1024(复杂特征)
    • 卷积核:常用3x3或5x5
    • 步长:控制扫描密集度(通常1-2)

2. 池化层 —— 信息压缩器

工作原理

nn.MaxPool2d(kernel_size=2)  # 每2x2区域保留最大值(类似拼图块取最明显部分)
  • 比喻:快递分拣员只看包裹最显眼的区域(如红色标签),忽略细节(如包装褶皱)

  • 作用

    • ✅ 降低计算量(缩小特征图尺寸)
    • ✅ 增强平移不变性(无论标签在左在右都识别)
  • 类型对比

    类型计算方式适用场景
    Max Pooling取区域最大值大多数情况(默认)
    Avg Pooling取区域平均值防止过拟合
    Global Pooling全局平均/最大值替代全连接层

3. 全连接层 —— 智能决策者

nn.Linear(1024, 10)  # 把1024个线索归纳为10种可能

工作原理

  • 比喻:侦探(全连接层)综合所有线索(特征图展平后的向量),推理出包裹目的地(分类结果)

  • 作用

    • ✅ 整合全局信息
    • ✅ 完成最终分类/回归
  • 设计技巧

    • 维度递减:如 2048 → 512 → 10

    • 配合Dropout防止过拟合:

      nn.Sequential(
          nn.Linear(2048, 512),
          nn.ReLU(),
          nn.Dropout(0.5),  # 随机屏蔽50%神经元
          nn.Linear(512, 10)
      )
      

4. 联合工作流程 —— 快递分拣流水线

 原始包裹(输入图片)
↓ 
扫描仪1(卷积层)→ 找出条形码区域
↓ 
压缩传送带(池化层)→ 聚焦关键区域
↓ 
扫描仪2(卷积层)→ 识别数字形状
↓ 
最终决策台(全连接层)→ 确定分拣目的地

实际代码示例

class ExpressNet(nn.Module):
    def __init__(self):
        super().__init__()
        # 特征提取流水线
        self.features = nn.Sequential(
            nn.Conv2d(3, 16, 5),   # 3通道RGB输入,16个扫描头
            nn.ReLU(),
            nn.MaxPool2d(2),       # 尺寸减半
            nn.Conv2d(16, 32, 3), # 更精细的扫描头
            nn.ReLU(),
            nn.MaxPool2d(2)
        )
        # 分类决策系统
        self.classifier = nn.Sequential(
            nn.Linear(32*6*6, 256),  # 展平后的维度计算:假设输入为128x128图片
            nn.ReLU(),
            nn.Linear(256, 10)       # 输出10个城市代码
        )

    def forward(self, x):
        x = self.features(x)      # 特征提取 → [batch,32,6,6]
        x = x.view(x.size(0), -1) # 展平 → [batch, 32*6*6]
        return self.classifier(x) # 分类决策

5. 超参数设置指南

卷积层配置

nn.Conv2d(
    in_channels=3,   # 输入通道数(RGB=3,灰度=1)
    out_channels=64, # 扫描头数量(复杂度决定)
    kernel_size=3,    # 扫描视野大小(常用3/5/7)
    stride=1,         # 扫描步长(控制特征图缩小速度)
    padding=1         # 边缘填充(防止尺寸缩小过快)
)

池化层配置

nn.MaxPool2d(
    kernel_size=2,    # 常用2x2或3x3
    stride=2          # 通常等于kernel_size
)

全连接层防过拟合技巧

nn.Sequential(
    nn.Linear(1024, 512),
    nn.BatchNorm1d(512),  # 加速训练
    nn.ReLU(),
    nn.Dropout(0.5),      # 随机屏蔽50%神经元
    nn.Linear(512, 10)
)

通过这种形象化的理解,您可以更直观地设计网络:

  • 图像分类任务:多堆叠卷积层(如ResNet50)
  • 文本处理任务:多用1D卷积或全连接层
  • 实时检测任务:减少全连接层(如YOLO使用全局池化)