🎓 总站 🏠 本课目录 01 图像基础 02 空间滤波 03 频率滤波 04 彩色处理 05 神经网络 06 表征学习 07 Transformer 08 CNN 09 目标识别 10 生成式模型
视觉计算 · 第8章

卷积神经网络(CNN)

从 MLP 的归纳偏置不足讲起,理解卷积层(局部连接、参数共享、平移等变)、步长/空洞卷积与特征图尺寸计算、池化、感受野,以及 LeNet/AlexNet/VGG/ResNet 等经典网络与残差连接。

📚 学习进度
0%

🎯学习目标

  • 理解 MLP 的不足与 CNN 的归纳偏置(局部性、平移等变、参数共享);
  • 掌握卷积层的五个视角、多通道卷积与参数量计算
  • 掌握步长 stride、填充 padding、空洞卷积及特征图尺寸公式
  • 理解最大/平均/全局池化、1×1 卷积、降采样与上采样;
  • 掌握感受野、特征图概念,编码器-解码器与 U-Net;
  • 熟悉 LeNet/AlexNet/VGG/GoogLeNet/ResNet 与残差连接

1从 MLP 到 CNN

MLP 是通用、简洁、易并行的近似器,但缺点明显:

⚠️ MLP 的缺点① 归纳偏置弱(weak inductive biases);② 样本效率低、数据饥渴;③ 全连接线性层计算量巨大。

图像具有局部性平移不变性:相关的事物聚集在一起,相距甚远的可假设相互独立;同样的内容在不同位置应被同样处理。

若假设输出是输入的局部函数,并对每个局部用相同权重(权重共享)计算,就得到了卷积神经网络。

⭐ FC → Conv全连接层 → 局部连接(只连接局部)→ 权重共享(各局部用同一组权重)= 卷积层。卷积核 W 就是应用于整张图像的同一滤波器。
💡 通俗理解:CNN = 专门为图像设计的网络

MLP的问题:

- 全连接:每个神经元连所有像素

- 参数太多:1000×1000图像需要10亿参数

- 没有"局部性"假设:不知道图像的局部相关性

CNN的改进:

1. 局部连接:只连局部区域

2. 权重共享:所有位置用同一组权重

3. 平移不变性:同样的内容在不同位置被同样处理

归纳偏置:

- CNN假设图像有"局部性"和"平移不变性"

- 这些假设是对的,所以CNN效果好

- 如果假设不对(比如全局关系很重要),CNN效果就差

参数量对比:

- MLP:1000×1000×1000 = 10亿参数

- CNN(3×3卷积核):3×3×通道数 = 几百个参数

- CNN参数量少几个数量级!

平移等变性:

- 输入平移,输出也平移

- 比如:猫在左边 → 特征在左边

- 猫在右边 → 特征在右边

- 这对图像处理很重要

2卷积层与五个视角 ⭐

卷积层是一种受约束的线性层:其权重矩阵是 Toeplitz(托普利茨)矩阵(每条左上到右下对角线元素相同)。约束带来更少的参数 → 更易学习、更少过拟合,且能应用于任意尺寸输入。

💡 通俗理解卷积就像用一个小放大镜在图像上滑动,每到一个位置就计算一次特征。同一个放大镜(卷积核)用于整张图像,所以参数很少。
💡 通俗理解:卷积 = 用"特征探测器"扫描图像

就像用放大镜看照片:

- 放大镜 = 卷积核(3×3 的小窗口)

- 照片 = 输入图像

- 扫描过程 = 卷积核在图像上滑动

每到一个位置:

1. 看看窗口里的像素

2. 和卷积核做匹配

3. 匹配程度 = 输出值

不同的卷积核找不同的特征:

- 边缘检测核 → 找边缘

- 模糊核 → 做模糊

- 锐化核 → 做锐化

卷积层的五个视角

🔁

平移等变

输入平移,输出同样平移。

🧩

区域块处理

对每个 patch 做处理。

🎛️

图像滤波

卷积即滤波运算。

🔗

参数共享

各位置共用一组权重。

📏

处理可变尺寸

可处理任意大小张量。

输入 + 滑动卷积核(3×3) 输出特征图 滑窗 + 权重共享 → 平移等变 → 参数远少于 FC
图1 · 卷积核在输入上滑动,权重共享产生输出特征图
卷积操作可视化
卷积操作:小窗口在图像上滑动,提取特征
💡 通俗理解:卷积层详解

核心意思:

卷积 = 用"特征探测器"扫描图像,提取局部特征

举个例子:

输入图像(5×5):
    1 1 1 0 0
    0 1 1 1 0
    0 0 1 1 1
    0 0 0 1 1
    0 0 0 0 1

卷积核(3×3,边缘检测):
    -1 -1 -1
    -1  8 -1
    -1 -1 -1

计算过程(在位置(1,1)):
    窗口:1 1 1
          0 1 1
          0 0 1

    计算:1×(-1) + 1×(-1) + 1×(-1) +
          0×(-1) + 1×8   + 1×(-1) +
          0×(-1) + 0×(-1) + 1×(-1)
        = -1 + -1 + -1 + 0 + 8 + -1 + 0 + 0 + -1
        = 3

不同的卷积核找不同的特征:
    卷积核          检测的特征
    边缘检测核      找边缘
    模糊核          做模糊
    锐化核          做锐化
    角点检测核      找角点

生活类比:

- 卷积核:像放大镜

- 图像:像照片

- 卷积过程:用放大镜在照片上滑动

- 每到一个位置:看看周围的像素,计算一个新值

为什么CNN有效?

因为图像有"局部性":相关的事物聚集在一起,卷积核正好利用了这个特性。

3多通道卷积与参数量 ⭐

图像处理中卷积常指单通道滤波;但神经网络的卷积层更通用——把多通道输入映射为多通道输出

  • 多通道输入:对 RGB 图像 $x \in \mathbb{R}^{3 \times H \times W}$,用多通道滤波器 $w \in \mathbb{R}^{3 \times K \times K}$,对各输入通道分别滤波再相加,得到单通道输出;
  • 多通道输出:用一个滤波器组 $\{w_0, \ldots, w_{C-1}\}$,每个滤波器产生一个输出通道(称为特征图 feature map);
  • 通用卷积层:把 $C_{in}$ 通道映射为 $C_{out}$ 通道,滤波器组是张量 $w \in \mathbb{R}^{C_{out} \times C_{in} \times K \times K}$。
⭐ 卷积层参数量公式
每个滤波器参数 $$= C_{in} \times K \times K$$
(加偏置则 $$+1$$)
整层参数量 $$= C_{out} \times (C_{in} \times K \times K + 1)$$
例:输入 3 通道、3×3 核,则每个滤波器有 $3 \times 3 \times 3 = 27$ 个参数;滤波器个数 = 输出通道数(题目未给则无法确定)。

4步长、填充、空洞卷积与尺寸计算 ⭐

步长卷积(Strided Convolution)

标准卷积保持空间分辨率;步长卷积以步长 $S$ 跳跃扫描,实现下采样 $\mathbb{R}^{H \times W} \to \mathbb{R}^{H/S \times W/S}$。可显著降低算力/内存,但会降低卷积质量("跳跃式扫描"漏细节),DFT 上可见混叠 aliasing 伪影。

⭐ 输出尺寸公式(必考)
输出 $$= \lfloor (W - F + 2P) / S \rfloor + 1$$
  $$W$$=输入尺寸  $$F$$=卷积核大小  $$P$$=填充  $$S$$=步长

填充(Padding)

在输入边缘补零(P),可控制输出尺寸(如 same 填充保持尺寸不变)。

空洞卷积(Dilated Convolution)

把卷积核元素在空间上拉开间距(空洞率 d),在不降分辨率、不增参数的前提下指数级扩大感受野。等效核大小:

$$K_{\text{dilated}} = (K - 1) \times d + 1$$
💡 注意空洞卷积也会引入伪影,且改变滤波器行为(不再具备平滑作用)。

5池化层(Pooling)

池化是一种降采样层,用某种聚合统计量概括一个图像块内的信息:

💡 通俗理解池化就像缩略图,把大图变小,但保留最重要的信息。比如最大池化就是"只记住最显眼的特征"。
类型聚合方式作用
最大池化 Max取窗口最大值对小平移稳定(不管边缘精确位置都有大响应)
平均池化 Avg取窗口平均值平滑、降采样
跨通道池化在特征通道间池化可实现旋转不变性(总有某角度滤波器响应)
全局池化 Global对整张特征图池化$C \times M \times N$ → 长度 $C$ 的向量,常用于输出端
13 24 Max 2×2 4 Max → 取最大(=4) Avg → 取平均(=2.5)
图2 · 2×2 池化:最大池化取最大值、平均池化取均值
池化操作可视化
池化操作:压缩特征图,保留重要信息

此外还有非线性滤波层:与卷积类似在张量上滑窗、相同独立处理,但执行的是局部窗口的非线性函数(如池化即一种)。

💡 通俗理解:池化层详解

核心意思:

池化 = 缩略图,把大图变小,保留最重要信息

举个例子:

输入特征图(4×4):
    1 3 2 1
    4 8 1 2
    2 1 6 3
    1 2 4 5

最大池化(2×2,步长2):
    每个2×2区域取最大值:

    区域1:[1,3,4,8] → 8
    区域2:[2,1,1,2] → 2
    区域3:[2,1,1,2] → 2
    区域4:[6,3,4,5] → 6

    输出:
    8 2
    2 6

平均池化(2×2,步长2):
    每个2×2区域取平均值:

    区域1:(1+3+4+8)/4 = 4.0
    区域2:(2+1+1+2)/4 = 1.5
    区域3:(2+1+1+2)/4 = 1.5
    区域4:(6+3+4+5)/4 = 4.5

    输出:
    4.0 1.5
    1.5 4.5

对比:
    方法    特点          用途
    最大池化  保留最显著特征  分类任务
    平均池化  保留整体信息    特征压缩

生活类比:

- 池化就像做缩略图

- 把4×4的图变成2×2的图

- 但保留了最重要的信息

为什么需要池化?

1. 减小特征图尺寸,降低计算量

2. 扩大感受野,看到更大范围

3. 对小平移保持稳定(特征位置不敏感)

61×1 卷积与上下采样

1×1 卷积

  • 跨通道信息集成;升维与降维;
  • 引入非线性(后接激活函数),让网络更深、学更复杂决策边界;
  • 不改变感受野与特征图尺寸,且只增极少参数、计算代价微乎其微。

降采样与上采样

CNN 可构建为分析-合成金字塔:分析时降采样(减空间维度、降算力、扩感受野、提取高级语义),合成时上采样(恢复空间细节)。

方向方法
降采样步长卷积、池化
上采样反池化 (Unpooling)、插值(最近邻/双线性)、转置卷积(反卷积,先膨胀再卷积)

7感受野与特征图

感受野(Receptive Field)

一个神经元的感受野是输入信号中它所敏感的区域。MLP 中每个神经元的感受野是整个输入;CNN 中每个神经元只能"看到"输入的一部分(由卷积核大小决定)。网络越深,感受野越大;常希望最后一层感受野覆盖整张图(如全局平均池化天然覆盖全图)。

💡 通俗理解感受野就是神经元能"看到"的范围。浅层只能看到一小块(比如一个边缘),深层能看到整张图(比如整只猫)。就像人看画:离得近看细节,离得远看全貌。

特征图(Feature Map)

  • 特征图既可指卷积层输出的某个通道,也可指某层所有通道的整体堆叠;
  • 对图像是 2D 空间数组;对视频是 3D 时空数组;
  • 随网络加深:空间分辨率越来越低,通道数越来越多——浅层敏感于边缘/线条,深层组合成角点、纹理乃至高级语义(信息重组)。
💡 可视化深层特征图深层 512/2048 通道无法逐个看,可用 PCA 取方差最大的 3 个主成分映射到 RGB——同色区域代表网络提取到相似特征(如所有"天空"呈蓝色、"建筑"呈红色)。
感受野可视化
感受野:浅层看局部,深层看全局

从分类到像素级理解:分类输出单个类别向量(全局池化压成一点);稠密预测(如语义分割)需保留空间位置。降采样太多则语义强但位置模糊,太少则位置准但语义弱(感受野太小)。

💡 通俗理解:感受野 = "视野范围"

感受野的定义:

- 一个神经元能"看到"的输入区域

- 就像你的"视野"有多大

浅层感受野:

- 只能看到一小块区域

- 提取局部特征(边缘、纹理)

深层感受野:

- 能看到更大区域

- 提取全局特征(物体、场景)

如何扩大感受野?

1. 增加卷积核大小(比如从3×3到5×5)

2. 堆叠更多层(每层扩大一点)

3. 使用池化(尺寸减半,感受野加倍)

4. 使用空洞卷积(不增加参数)

空洞卷积:

- 卷积核元素之间有间隔

- 等效核大小 = (K-1)×d + 1

- d是空洞率,K是原始核大小

- 例子:3×3卷积核,空洞率2 → 等效5×5

特征图的变化:

- 浅层:尺寸大,通道少,细节多

- 深层:尺寸小,通道多,语义多

- 就像"金字塔":越往上越小,但信息越抽象

💡 特征图详解:卷积层输出的"特征地图"

核心意思:

特征图 = 卷积层输出的"特征地图",每个通道检测一种特征

举个例子:

输入图像(猫的照片)经过卷积层后:

    通道1(边缘检测):
    - 检测到猫的轮廓
    - 值大的地方 = 有边缘

    通道2(纹理检测):
    - 检测到猫的毛发纹理
    - 值大的地方 = 有纹理

    通道3(颜色检测):
    - 检测到猫的颜色
    - 值大的地方 = 有特定颜色

    ...共64个通道,每个检测不同特征

特征图的变化规律:

    浅层(第1层):
    - 尺寸大(和原图差不多)
    - 通道少(64个)
    - 特征简单(边缘、颜色)

    深层(第10层):
    - 尺寸小(缩小很多)
    - 通道多(512个)
    - 特征复杂(眼睛、耳朵、整体形状)

可视化深层特征图:

用PCA把512维降到3维,映射到RGB:
    - 同色区域 = 网络认为相似的特征
    - 比如"天空"都是蓝色,"建筑"都是红色

生活类比:

- 特征图:像不同滤镜下的照片

- 每个通道:像一种特殊的眼镜

- 浅层特征:像看到线条和颜色

- 深层特征:像看到物体和场景

8编码器-解码器与 U-Net

编码器以图像为输入逐层降采样到低维特征图;解码器以低维特征为输入逐层上采样到图像输出。二者结合即编码器-解码器架构,强制信号通过一个信息瓶颈——迫使网络抽象,同时降采样省内存算力。

⭐ U-Net 的跳跃连接低维瓶颈让解码器难以输出高频细节。U-Net 增加跳跃连接(skip connection):把每个下采样层最后的通道激活,与对应上采样层的第一组通道拼接,既维持信息瓶颈,又让高分辨率空间信息流过,恢复高频细节。
Encoder↓ 瓶颈 Decoder↑ skip connection 跳跃连接
图3 · U-Net:编码器-解码器 + 跳跃连接
💡 编码器-解码器详解:压缩-解压缩过程

核心意思:

编码器 = 压缩信息,解码器 = 恢复信息,像"压缩-解压缩"过程

举个例子:

图像分割任务(给每个像素分类):

编码器(下采样):
    输入:256×256×3(原图)
    → 卷积+池化 → 128×128×64
    → 卷积+池化 → 64×64×128
    → 卷积+池化 → 32×32×256
    → 卷积+池化 → 16×16×512(瓶颈)

    作用:提取特征,压缩信息
    问题:空间信息丢失了!

解码器(上采样):
    输入:16×16×512(瓶颈)
    → 上采样+卷积 → 32×32×256
    → 上采样+卷积 → 64×64×128
    → 上采样+卷积 → 128×128×64
    → 上采样+卷积 → 256×256×类别数

    作用:恢复空间信息,输出分割结果

U-Net的跳跃连接:

编码器的特征 → 拼接 → 解码器
好处:保留空间细节,分割更精准

生活类比:

- 编码器:像把文章压缩成摘要

- 解码器:像把摘要扩写回文章

- 跳跃连接:像写摘要时保留原文关键段落

为什么需要编码器-解码器?

1. 减少计算量(压缩后处理更快)
2. 扩大感受野(看到更大范围)
3. 提取语义特征(理解图像内容)

9经典网络与 ResNet ⭐

ImageNet 数据集:约 100 万张带标签图像、1000 个类别,是经典网络的试金石(ILSVRC 竞赛)。

网络层数特点
LeNet~7 层最早的卷积网络(手写数字)
AlexNet8 层2012 ImageNet 突破,ReLU + Dropout
VGG16 层统一用 $3 \times 3$ 小卷积堆叠
GoogLeNet22 层Inception 模块
ResNet152 层2015 ILSVRC 冠军,错误率 3.57%,引入残差连接
⭐ 残差连接(Residual Connection)给非线性卷积层增加一条直连边提高信息传播效率:把目标函数拆为恒等函数 + 残差函数,让单元 $f(x;\theta)$ 去近似 $h(x) - x$,用 $f(x;\theta) + x$ 逼近 $h(x)$。这样形成嵌套函数类——更复杂的函数类一定包含较简单者,保证不会因加深而变差,从而可训练极深网络(缓解退化/梯度问题)。
💡 通俗理解:残差连接 = "抄近道"

问题:网络太深会"退化"

- 深层网络效果反而不如浅层

- 因为信息经过太多层会"丢失"

残差连接的做法:

- 不直接学输出 F(x)

- 而是学"和输入的差" F(x) - x

- 最终输出 = x + F(x)

就像:

- 你要从 A 走到 B

- 不是走一条很长的路

- 而是"从 A 出发,走一小段修正,回到 A + 修正"

好处:

- 梯度可以直接传回去(不会消失)

- 网络可以很深(100+层)而不会退化

x 卷积+ReLU 卷积 f(x) + h(x) 恒等捷径 (skip): + x
图4 · 残差块:输出 = f(x) + x(学习残差 h(x)−x)
💡 通俗理解:残差连接 = "高速公路"

问题:深度网络的"退化"现象

- 网络越深,效果反而越差

- 不是过拟合(训练集上也差)

- 是因为梯度消失/爆炸

残差连接的做法:

- 不直接学输出 F(x)

- 而是学"和输入的差" F(x) - x

- 最终输出 = x + F(x)

类比:

- 你要从A走到B

- 不是走一条很长的路

- 而是"A + 修正量"

- 修正量很小,容易学

好处:

1. 梯度可以直接传回去(不会消失)

2. 网络可以很深(100+层)

3. 至少不会比浅层差(最坏情况F(x)=0)

ResNet的贡献:

- 让网络可以训练到100+层

- 在ImageNet上取得突破

- 成为深度学习的里程碑

残差块的结构:

- 输入 → 卷积 → BN → ReLU → 卷积 → BN → +输入 → ReLU

- 跳跃连接绕过两层卷积

- 梯度可以通过跳跃连接直接传回

💡 通俗理解:残差连接详解

核心意思:

残差连接 = "抄近道",让梯度可以直接传回去,解决深层网络的退化问题

举个例子:

传统网络(无残差):
    输入x → 层1 → 层2 → ... → 层n → 输出F(x)
    问题:层数太多,梯度会消失,网络退化

残差网络:
    输入x → 层1 → 层2 → ... → 层n → F(x)
        ↓                              ↓
        └──────────────────────────────→ + → 输出 = x + F(x)

    跳跃连接:x 直接加到输出上

好处:
1. 梯度可以通过跳跃连接直接传回去(不会消失)
2. 网络可以很深(100+层)
3. 至少不会比浅层差(最坏情况F(x)=0,输出=x)

数值示例:
    输入x = 100
    传统网络:F(x) = 0.01(梯度消失,输出很小)
    残差网络:x + F(x) = 100 + 0.01 = 100.01(输出接近输入)

生活类比:

- 传统网络:像走一条很长的路,可能迷路

- 残差网络:像有"高速公路",可以直接到达目的地

ResNet的贡献:

- 让网络可以训练到100+层

- 在ImageNet上取得突破

- 成为深度学习的里程碑

重点例题

例题1:卷积输出尺寸计算 输入 $32 \times 32$,卷积核 $5 \times 5$,padding $P=2$,stride $S=1$,求输出尺寸。
输出 $$= (W - F + 2P)/S + 1$$
     $$= (32 - 5 + 2 \times 2)/1 + 1$$
     $$= 31/1 + 1 = 32$$
结论:输出为 $32 \times 32$(same 填充,尺寸不变)。
例题2:卷积层参数量计算 输入 3 通道、卷积核 $3 \times 3$、输出 64 通道(含偏置),求参数量。
每个滤波器 $$= C_{in} \times K \times K = 3 \times 3 \times 3 = 27$$($$+1$$ 偏置 $$= 28$$)
整层 $$= C_{out} \times (C_{in} \cdot K \cdot K + 1) = 64 \times 28 = 1792$$
对应课件例题:输入 3 通道、3×3 核,每个滤波器参数 $= 3 \times 3 \times 3 = $27(答案 b);滤波器个数 = 输出通道数,题目未给则无法确定
例题3:空洞卷积等效核大小与残差作用 ① 3×3 卷积、空洞率 d=2:$K_{\text{dilated}} = (3-1) \times 2 + 1 = 5$,等效 5×5 感受野,但参数仍只 9 个。
残差连接作用:让网络学习残差 $h(x)-x$ 而非直接学 $h(x)$,形成嵌套函数类,缓解深层退化与梯度问题,使极深网络(152 层)可训练。

🎯自测(点击展开)

从全连接层如何一步步得到卷积层?
全连接 → 局部连接(只连局部)→ 权重共享(各局部用同一组权重)= 卷积层。
卷积层为什么参数比全连接少?
局部连接 + 权重共享,是受约束的线性层(Toeplitz 矩阵),参数大幅减少,更易学、更不易过拟合。
写出卷积输出尺寸公式。
输出 = (W − F + 2P)/S + 1,W 输入尺寸、F 核大小、P 填充、S 步长。
最大池化为什么能带来平移稳定性?
在空间局部取最大值,无论边缘精确位置如何都有较大响应,对小平移不敏感。
1×1 卷积有哪些用途?
跨通道信息集成、升降维、引入非线性,几乎不增计算与感受野。
残差连接如何表达目标函数?
拆成恒等+残差:用 f(x;θ) 近似 h(x)−x,再用 f(x;θ)+x 逼近 h(x)。

📝强化题库

选择题点选即时判分;填空题输入后"检查"或"显示答案"。

已答 0/0答对 0正确率
已答 0/0答对 0