CNN的核心组成部分

一个典型的卷积神经网络由以下几种关键层构成 :
  1. 卷积层 (Convolution Layers): CNN的核心,用于提取局部特征。
  1. 激活函数 (Activation Function): 如ReLU,为网络引入非线性。
  1. 池化层 (Pooling Layers): 用于对特征图进行降采样,以减少计算量并增大感受野。
  1. 归一化层 (Normalization): 如批量归一化 (Batch Normalization),用于加速训练并提升模型稳定性。
  1. 全连接层 (Fully-Connected Layers): 通常位于网络的末端,用于根据提取到的特征进行分类或回归。

Convolution Layer

Filter / Kernel

  • 卷积层通过滤波器(也称)在输入数据上滑动来工作。
  • 这个滤波器是一个小的权重矩阵,它会在输入图像的空间维度上(高度和宽度)滑动,并计算所覆盖区域的点积。
  • 滤波器的深度必须与输入数据的深度相同。例如,对于一个 3x32x32 的输入图像,一个 5x5 的滤波器的实际尺寸是 3x5x5

Activation Map

notion image
  • 滤波器与输入图像的一个小块(例如3x5x5)进行点积运算,再加上一个偏置项 b,从而产生一个单一的数值。这个运算的数学表达式为
  • 当滤波器在整个输入图像上滑动后,所有这些点积结果就共同构成了一个二维的激活图
  • 通常,我们会使用多个滤波器(例如6个3x5x5 的滤波器),每个滤波器都会生成一个独立的激活图。这些激活图最终会堆叠在一起,形成一个新的输出卷(例如 6x28x28
notion image
notion image

Zero Padding

  • 在进行卷积操作时,如果不进行任何处理,输出的特征图尺寸会比输入时小 。例如,一个7x7 的输入经过一个 3x3 的滤波器后,输出会变为 5x5 。如果网络很深,这种“缩水”现象会非常严重,导致空间信息快速丢失 。
  • 零填充 (Zero Padding),即在输入卷的边界周围添加值为零的像素 。
notion image
  • 假设输入宽度为 W,滤波器尺寸为 K,填充宽度为 P,则输出宽度为:
    • 一个非常普遍的设置是选择填充 ,这样可以确保输出的特征图与输入的尺寸完全相同。

    Receptive Fields

    • 感受野指的是在输出特征图上的一个像素点,其计算结果所依赖的 原始输入区域 的大小 。一个K×K 的卷积核,其输出的每个元素都对应了输入中一个 K×K 的感受野 。
    • 感受野的增长:
      • 每增加一个卷积层,感受野的大小会随之扩大。具体来说,每经过一个核大小为
        • K 的卷积层,感受野的尺寸会增加 K−1 。
      • 对于一个由L 个卷积层(每个核大小都为 K)组成的网络,其最终的感受野大小为:
    notion image
    • 问题与解决方案:
      • 问题: 对于非常大的图像,如果只依靠堆叠卷积层来扩大感受野,就需要非常多的层才能让输出“看到”整个图像,这会导致网络过深且效率低下 。
      • 解决方案: 在网络内部进行 降采样 (Downsample) 。这可以通过带步长的卷积 (Strided Convolution) 或 池化层 (Pooling Layers))来实现,它们都能在减小特征图尺寸的同时,有效地扩大后续层的感受野。

    Strided Convolution

    • 默认情况下,卷积的步长为1,意味着滤波器在输入数据上逐个像素地滑动。当我们将步长设置为大于1的数值(例如2)时,滤波器会在每次移动时“跳过”指定数量的像素 。
    • 效果与目的:
      • 减小输出尺寸: 这是最直接的效果。更大的步长会产生更小的输出特征图。
      • 扩大感受野: 与池化层类似,带步长的卷积也是一种在不增加网络深度的前提下,有效扩大感受野的方法。
    • 假设输入宽度为 W,滤波器尺寸为 K,填充宽度为 P,步长为S,则输出宽度为:

      Convolution Summary

      notion image

      PyTorch中的卷积层

      在PyTorch中,你可以使用 torch.nn 模块轻松实现不同维度的卷积:
      • 2D 卷积
        • torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0)
      • 1D 卷积
        • torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0)
      • 3D 卷积 torch.nn.Conv3d(in_channels, out_channels, kernel_size, stride=1, padding=0)

      Pooling Layer

      池化层是另一种实现降采样 的方法 。它通常被放置在连续的卷积层之间。
      主要目的:
      1. 减小特征图的空间尺寸,从而减少后续层的参数和计算量。
      1. 增大感受野 (Receptive Field),让后续的卷积层能看到更广阔的原始输入区域。
      1. 提供一定程度的平移不变性 。

      Max Pooling

      notion image

      Pooling Summary/

      notion image

      LeNet-5 示例

      notion image
      Layer
      Output Size
      Weight Size
      1x28x28
      )
      20x28x28
      20x1x5x5
      20x28x28
      20x14x14
      50x14x14
      50x20x5x5
      50x14x14
      50x7x7
      2450
      500
      2450x500
      500
      10
      500x10
      • 随着网络深度的增加,空间尺寸 (高度和宽度) 会逐渐减小 。
      • 同时,通道数 (深度) 会逐渐增加 。

      Normalization Layers

      深度网络训练起来非常困难。归一化层,特别是批量归一化 (Batch Normalization, BN),极大地改善了深度网络的训练过程 。

      Batch Normalization)

      核心思想: BN对一整批 (batch) 数据在每个通道上的激活值进行归一化,使其具有零均值和单位方差 。
      数学过程:
      1. 计算批数据在每个通道 上的均值 和方差
      1. 对每个激活值 进行归一化。
        1. notion image
      1. 通过两个可学习的参数——缩放因子
        1. 和偏移因子 ,对归一化后的值进行线性变换,以恢复其表达能力。
      Problem: Estimates depend on minibatch; can’t do this at test-time!
      notion image

      Batch Normalization for ConvNets

      notion image

      Layer Normalization

      在单个样本的所有通道上进行归一化。在训练和测试时行为一致,常用于RNN和Transformer。
      notion image

      Instance Normalization

      notion image

      Companion

      notion image
      Loading...