CS231n Lecture 5 Note

2537 字
13 分钟
CS231n Lecture 5 Note

See: Convolutional Networks

Convolutional Networks 12<32>#

特征提取 vs 梯度下降 15<04>#

在深度学习爆发之前,计算机视觉是如何工作的?

  • 传统路线(特征工程 + 线性分类器)
    • 以前不能把原始像素直接喂给模型,而是由人类专家手动设计特征提取器(Feature Extractors)
    • 颜色直方图 (Color Histogram):统计图像中各种颜色的像素数量分布,忽略空间结构(比如识别苹果的红绿色)。
      image.png
      image.png
    • 方向梯度直方图 (HOG):忽略颜色,只提取图像的边缘和轮廓方向(比如识别青蛙或人的轮廓)。
      image.png
      image.png
    • 做法:把这些手动提取的特征拼在一起,再训练一个线性分类器。
      image.png
      image.png
  • 深度学习路线(端到端学习 End-to-End)
    • 核心思想:梯度下降(数据和算力)比人类专家更擅长提取特征。
    • 我们依然是从原始像素到分数,但中间所有的特征提取过程,都交给了由神经网络构成的“计算图”,通过反向传播自动学习

上次提到的神经网络的问题#

  • 图像不是一维而是二维的,但却被展平了,因此会失去部分结构特征。

卷积神经网络 Convolutional Neural Network#

image.png
image.png

  • 历史脉络
    • 1998年 (LeNet):Yann LeCun 等人发明的早期 CNN,用于手写数字识别,架构与今天非常相似。
    • 2012年 (AlexNet):ImageNet 大赛冠军,彻底引爆深度学习。得益于 GPU、大数据(互联网)和更深的网络。
    • 2012 - 2020年 (CNN 统治期):目标检测、图像分割、图像描述(Image Captioning)、甚至早期的图像生成(如 Stable Diffusion 早期版本),全都是基于 CNN。
  • 后 CNN 时代 (2020年之后 - 引入 Transformer)
    • 教授坦诚地提到,自 2020/2021 年起,起源于自然语言处理的 Vision Transformer (ViT) 开始在图像领域击败 CNN。
    • 但 CNN 仍极具学习价值,因为它是理解图像局部特性的最佳途经,且现在很多先进架构是 CNN 和 Transformer 的混合体。

卷积层 (Convolutional Layer) 31<34>#

为什么要把全连接网络升级为 CNN?因为图像是 2D 的,把图像“拉平”成一维向量会破坏空间结构

卷积是如何工作的?#

  • 全连接层 (FC):每个权重模板和整个图像一样大,计算全局点积。
    image.png
    image.png
  • 卷积层 (Conv):权重变成了小巧的 3D 滤波器(Filters/Kernels),例如 5×5×35×5×3(宽、高、颜色通道)。
    image.png
    image.png
    • 滑动窗口 (Sliding Window):将这个小滤波器在原图上滑动,每次匹配一个局部区域(点积+偏置),得到一个标量分数。
    • 生成特征图 (Activation Map):一个滤波器扫遍全图,会生成一个 2D 的响应平面(Feature Map)。
    • 多滤波器:如果使用 6 个不同的滤波器,就会生成 6 个 2D 平面,堆叠起来变成输出厚度(通道数)为 6 的 3D 张量。
      image.png
      image.png
      image.png
      image.png
    • General Form:
      image.png
      image.png
    • 为了防止全是线性,加 activation functions !
      image.png
      image.png
  • 滤波器在学什么?
    • 浅层(第一层):通常学习低级特征,如边缘(垂直/水平线)和对立颜色(红绿斑块)。
    • 深层:学习高级语义特征(如眼睛、文本、车轮甚至人脸)。

空间维度计算公式#

假设输入尺寸为WW(宽/高),滤波器大小为KK,填充为PP,步长为SS

  • 输出尺寸公式Wout=WK+2PS+1Wout=\frac{W-K+2P}{S}+1
  • 步长 (Stride):滤波器滑动的步幅。步长大于 1 会导致输出尺寸缩小(下采样)。
  • 填充 (Padding):为了防止每次卷积后图像越来越小,并在边缘保留信息,会在原图外围补 0。
    • 常用技巧:为了让卷积前后的空间尺寸保持不变,当S=1S=1时,通常设置P=K12P=\frac{K−1}{2}(例如K=3K=3P=1P=1K=5K=5P=2P=2)。

参数量与计算量估算#

  • 输入3×32×323×32×32
  • 卷积操作:10 个滤波器,尺寸5×55×5,步长S=1S=1,填充P=2P=2
  • 输出尺寸10×32×3210×32×32(因为填充抵消了滤波器的收缩)。
  • 参数量 (Parameters):每个滤波器有5×5×3=755×5×3=75个权重,加 1 个偏置=76=76。共 10 个滤波器,所以76×10=76076×10=760个可学习参数。
  • 计算量 (FLOPs):输出包含10×32×3210,00010×32×32≈10,000个像素点,每个点需要5×5×3=755×5×3=75次乘加运算。总计算量约76.876.8万次。
  • 显存消耗的三大来源
    1. 激活值 (Activations):前向传播每一层产生的特征图大小。绝大部分显存消耗在网络的浅层(前几个卷积层)。因为反向传播求梯度时需要用到它们,所以不能丢弃。
    2. 参数与梯度 (Parameters & Gradients):权重矩阵的大小。绝大部分参数集中在网络末端的全连接层 (FC Layer)
    3. 杂项 (Misc):如 Batch 里的数据、优化器(Momentum, Adam 等)缓存的动量状态(通常要把参数量占用的内存乘以 2 到 3)。
  • 优化策略:如果遇到 “Out of Memory (OOM)“,最有效的做法通常是减小 Batch Size,因为激活值占用的显存与 Batch Size 成正比。

感受野 (Receptive Field)#

  • 定义:输出特征图上的一个像素点,受到了原始输入图像中多大区域的影响。
  • 增长规律:如果只是堆叠3×33×3且步长为 1 的卷积,感受野会线性增长(很慢)。
    image.png
    image.png
  • 如何加速增长:通过引入步长(Stride > 1) 进行下采样,后续层的感受野相对于原图会呈指数级增长,从而能够捕捉全局信息。

PyTorch Convolution Layer#

image.png
image.png

参数共享 (Parameter Sharing)#

  • 核心假设:如果某个特征(如水平边缘)在图像的某个位置 (x,y) 是有用的,那么它在图像的另一个位置 (x2,y2) 也很可能是有用的(因为图像具有平移不变性)。
  • 作用:强制同一个特征图(Depth slice)上的所有神经元共享同一组权重(Filter)和偏置。这使得参数量从天文数字(如全连接层的上亿参数)骤降到几万甚至几百个参数。

卷积的底层工程实现 (im2col)#

  • 实际上,代码底层(如 PyTorch/Caffe)并不会真的用一个个小窗口去“滑动”(效率太低)。
  • im2col (Image to Column):将输入图像中每一个感受野区域“拉平”成列向量,同时将滤波器拉平为行向量,从而将整个卷积操作转化为一次巨大的矩阵乘法 (Matrix Multiplication)。这样可以极大利用 GPU 的 BLAS 库进行加速。缺点是会消耗更多内存(因为感受野重叠部分的像素被复制了多次)。

特殊卷积类型#

  • 1x1 卷积 (1x1 Convolution)
    • 乍一看 1x1 似乎没有空间感受野,但在 3D 张量中,1x1 卷积实际上是跨通道的线性组合(Depth-wise Dot Product)
    • 作用:常用于改变通道数(降维或升维,例如将 512 通道降到 64 通道),从而大幅减少计算量,同时加入 ReLU 增加非线性。
  • 空洞卷积 (Dilated Convolutions)
    • 滤波器元素之间有“空隙”(Dilation)。
    • 作用:在不增加参数量的前提下,极其迅速地扩大感受野。常用于图像分割任务。

将全连接层转换为卷积层 (FC \to CONV Conversion)#

  • 任何全连接层(FC)都可以等效地写成卷积层(CONV)。
    • 假设输入是7×7×5127×7×512,接一个有 4096 个神经元的 FC 层。这可以等效为一个F=7,P=0,S=1,K=4096F=7,P=0,S=1,K=4096的卷积层,输出为1×1×40961×1×4096
  • 为什么要这么做?(工程意义)
    • 传统的 FC 层要求输入图像尺寸必须完全固定(比如必须是224×224224×224)。
    • 如果把最后的 FC 层全改成 CONV 层,网络就可以接受任意更大尺寸的图像输入。例如输入384×384384×384的图像时,一次前向传播就能输出一个6×66×6的类别得分矩阵(相当于对原图进行了 36 次不同位置的裁剪并分类),这被称为滑动窗口的高效实现

池化层 (Pooling Layer) 59<36>#

  • 作用:一种极其廉价的“下采样”方式,不需要学习参数,用于缩小特征图的空间尺寸,减少计算量,并加速感受野的增长。
    image.png
    image.png
  • 独立操作:池化是对每个通道(Depth Slice)独立进行的,不会混合通道信息。
  • 最大池化 (Max Pooling):最常用的池化方式。例如使用2×22×2窗口,步长为 2。在每个2×22×2的非重叠区域内取出最大值。
    image.png
    image.png
    • 注意:由于取最大值是一种非线性操作,所以最大池化本身也引入了非线性(类似 ReLU 的作用)。但如果用取平均值的函数,就是线性操作了。
    • 池化层通常不使用填充(Padding)。
  • 总结:
    • Input: C×H×WC \times H \times W
    • Hyperparameters:
      • Kernel Size: KK
      • Stride: SS
      • Pooling function: max, avg
    • Output size: C×H×WC \times H' \times W' where:
      • H=HKS+1H'=\frac{H-K}{S}+1
      • W=WKS+1W'=\frac{W-K}{S}+1
    • No learnable parameters
    • Common setting: max, K=2,S=2    K=2, S=2\impliesGives 2x downsampling

平移等变性 (Translation Equivariance) 1:05<21>#

  • 概念解释:如果你把原图中的一只猫向右平移了 10 个像素,那么 CNN 提取出的特征图中的“猫的特征”,也会向右平移相应的像素,内容不会变。
  • 意义:这完美契合了人类的视觉直觉——图像中的内容不应该因为它在画面中的绝对位置而改变(我在画面左边看到一张凳子和在右边看到一张凳子,提取的特征应该是一样的)。CNN 的滑动窗口机制先天自带这种优秀的数学性质。
    image.png
    image.png

网络架构的设计经验法则 (Architecture Rules of Thumb)#

  • 经典架构模式INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC
  • 黄金法则:为什么用多个小卷积代替一个大卷积?(VGG Principle)
    • 对比:堆叠 3 个3×33×3卷积层 vs. 使用 1 个7×77×7卷积层。
    • 感受野相同:两者的感受野大小是一样的(都是7×77×7)。
    • 非线性更强:3个小卷积层之间包含了 3 次 ReLU 激活,使得特征提取的非线性表达能力更强。
    • 参数量更少:假设通道数都是CC,3 个3×33×3层的参数量是3×(3×3×C×C)=27C23×(3×3×C×C)=27C^2;而 1 个7×77×7层的参数量是7×7×C×C=49C27×7×C×C=49C^2。小卷积更省参数!

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

CS231n Lecture 5 Note
https://molju.com/posts/cs231nlec5/
作者
molju
发布于
2026-07-30
许可协议
CC BY-NC-SA 4.0

评论区

分类
标签
最新动态