10 卷积神经网络(CNN)示例

10 卷积神经网络(CNN)示例

卷积神经网络(CNN)课程总结 —— 吴恩达《深度学习》系列课程精讲


🎯 课程目标

本节课程旨在通过一个典型卷积神经网络结构示例,帮助理解 CNN 的基本构建模块、各层的参数计算方法以及整体网络设计逻辑。该模型受经典 LeNet-5 启发,适用于手写数字识别任务(如 MNIST 数据集),是计算机视觉中非常典型的架构。


🔧 网络结构概览

层名 类型 超参数 输出形状 激活值大小 参数数量
Input 输入 - (32,32,3) 3072 0
CONV1 卷积 $f=5, s=1, p=0$, 过滤器数 = 6 (28,28,6) 6,272 208
POOL1 最大池化 $f=2, s=2$ (14,14,6) 1,568 0
CONV2 卷积 $f=5, s=1, p=0$, 过滤器数 = 16 (10,10,16) 1,600 416
POOL2 最大池化 $f=2, s=2$ (5,5,16) 400 0
FC3 全连接 120 个神经元 (120,1) 120 48,001
FC4 全连接 84 个神经元 (84,1) 84 10,081
Softmax 分类输出 - (10,1) 10 841

:激活值大小 = 所有维度乘积(即元素总数)


🧱 基本构造模块解析

1. 输入层

  • 输入图像尺寸:$32 \times 32 \times 3$

  • 表示一张 RGB 图像

  • 总激活值大小:

    $$
    32 \times 32 \times 3 = 3072
    $$


2. 卷积层(CONV1)

参数设置:

  • 过滤器大小:$f = 5$
  • 步幅:$s = 1$
  • Padding:$p = 0$
  • 过滤器数量:$C_{\text{out}} = 6$

输出尺寸计算:

$$
H’ = \frac{H - f}{s} + 1 = \frac{32 - 5}{1} + 1 = 28 \
W’ = \frac{W - f}{s} + 1 = \frac{32 - 5}{1} + 1 = 28 \
C’ = 6
$$

所以输出为:$(28, 28, 6)$

激活值大小:

$$
28 \times 28 \times 6 = 6,!272
$$

参数数量计算:

每个过滤器是 $5 \times 5 \times 3$,共 6 个过滤器,加上偏置项:

$$
\text{参数数} = (5 \times 5 \times 3) \times 6 + 6 = 450 + 6 = \boxed{456}
$$

⚠️ 但原文表中写的是 208?
→ 实际上这里可能存在笔误或数据错误。我们重新核对:

如果原题说“过滤器个数为6”,且输入通道为3,则单个过滤器参数为 $5\times5\times3 = 75$,6个过滤器共 $75 \times 6 = 450$,加偏置 $6$,总参数应为 $456$。

但表格中写的是 208,这可能对应的是 6 个过滤器,但输入通道为 1(灰度图) 的情况:

$$
(5 \times 5 \times 1) \times 6 + 6 = 150 + 6 = 156
$$

也不对。

再看:若输入是 $32\times32\times3$,而过滤器是 $5\times5\times3$,则每过滤器 75 个权重,6 个 → $6 \times 75 = 450$,+6 偏置 = 456

结论:表格中的 “208” 很可能是错误的!正确值应为 456。

不过为了与原始资料一致,我们先保留其标注方式,并指出问题。

❗ 注意:在实际教学中,有时会简化数值以方便演示。但严格来说,此处参数应为 456。


3. 池化层(POOL1)

  • 使用最大池化(Max Pooling)
  • 超参数:$f=2, s=2$
  • 不使用 padding
  • 无学习参数(仅超参数)

输出尺寸:

$$
H’ = \frac{28 - 2}{2} + 1 = 14 \
W’ = \frac{28 - 2}{2} + 1 = 14 \
C’ = 6
$$

输出:$(14, 14, 6)$

激活值大小:

$$
14 \times 14 \times 6 = 1,!176
$$

❌ 但表中写的是 1,568?
→ 14×14×6 = 1176,不是 1568!

再次发现矛盾!

检查是否是之前的错误延续?

再看:CONV1 输出是 (28,28,6),那 POOL1 是对它做池化:

$$
\frac{28 - 2}{2} + 1 = 14 \quad \Rightarrow \quad (14,14,6)
\Rightarrow 14 \times 14 \times 6 = 1,!176
$$

但表中写的是 1,568,这是 $14 \times 14 \times 8 = 1568$,说明可能是通道数错标了?

或者——是不是 CONV1 的输出是 8 个通道?但文中说是 6 个。

👉 推测:表格中存在多处笔误,包括:

错误点 应为 实际写成
CONV1 参数 456 208
POOL1 激活值 1176 1568
CONV2 参数 416 416 ✅(合理)

但继续分析时仍按逻辑推导为准。


4. 第二卷积层(CONV2)

  • 过滤器大小:$f=5$
  • 步幅:$s=1$
  • Padding:0
  • 过滤器数量:16
  • 输入:$(14,14,6)$

输出尺寸:

$$
H’ = \frac{14 - 5}{1} + 1 = 10 \
W’ = \frac{14 - 5}{1} + 1 = 10 \
C’ = 16
$$

输出:$(10,10,16)$

激活值大小:

$$
10 \times 10 \times 16 = 1,!600
$$

参数数量:

每个过滤器:$5 \times 5 \times 6 = 150$
16 个过滤器:$150 \times 16 = 2,!400$

  • 偏置:16

$$
\text{总参数} = 2,!400 + 16 = \boxed{2,!416}
$$


5. 第二池化层(POOL2)

  • Max pooling: $f=2, s=2$
  • 输入:$(10,10,16)$

输出尺寸:

$$
\frac{10 - 2}{2} + 1 = 5 \quad \Rightarrow \quad (5,5,16)
$$

激活值大小:

$$
5 \times 5 \times 16 = 400
$$


6. 全连接层(FC3)

  • 将 POOL2 输出展平:$5 \times 5 \times 16 = 400$
  • 输入维度:400
  • 输出维度:120

权重矩阵维度:

$$
W \in \mathbb{R}^{120 \times 400}, \quad b \in \mathbb{R}^{120}
$$

参数数量:

$$
120 \times 400 + 120 = 48,!000 + 120 = \boxed{48,!120}
$$


7. 全连接层(FC4)

  • 输入:120
  • 输出:84

参数数量:

$$
84 \times 120 + 84 = 10,!080 + 84 = \boxed{10,!164}
$$


8. Softmax 层

  • 输入:84

  • 输出:10(分类数)

  • 参数数量:

    $$
    10 \times 84 + 10 = 840 + 10 = \boxed{850}
    $$


📊 参数总结(修正版)

参数数(修正后)
CONV1 $(5×5×3)×6 + 6 = 456$
POOL1 0
CONV2 $(5×5×6)×16 + 16 = 2416$
POOL2 0
FC3 $120×400 + 120 = 48,120$
FC4 $84×120 + 84 = 10,164$
Softmax $10×84 + 10 = 850$

⚠️ 原始表格中的参数数量大多偏低,可能是由于通道数或偏置计算错误。


✅ 核心知识点提炼

1. 卷积层参数计算公式

对于一个卷积层:

  • 输入:$(H, W, C_{\text{in}})$

  • 过滤器:$(f, f, C_{\text{in}}, C_{\text{out}})$

  • 参数数量:

    $$
    \text{params} = f \cdot f \cdot C_{\text{in}} \cdot C_{\text{out}} + C_{\text{out}}
    $$

    (权重 + 偏置)


2. 池化层特性

  • 无训练参数
  • 仅依赖超参数($f, s$)
  • 常用最大池化(Max Pooling)
  • 作用:降低空间分辨率,提升平移不变性

3. 全连接层参数

  • 输入维度 $d$,输出维度 $k$

  • 参数数:

    $$
    \text{params} = d \cdot k + k = k(d + 1)
    $$


4. 激活值大小变化趋势

随着网络加深:

  • 高度和宽度减少:32 → 28 → 14 → 10 → 5
  • 通道数增加:3 → 6 → 16 → …
  • 激活值总量逐渐减小:3072 → 6272 → 1176 → 1600 → 400 → 120 → 84 → 10

✅ 设计原则:避免激活值下降过快,否则信息丢失严重。


5. 网络层级划分惯例

  • Layer1:CONV1 + POOL1(视为一层)
  • Layer2:CONV2 + POOL2
  • Layer3~4:FC3, FC4
  • 统计层数时,通常只计含参数的层(如卷积、全连接)

6. 典型 CNN 架构模式

Input → [Conv → Pool] × n → [FC] × m → Softmax

即:

  • 多组“卷积 + 池化”堆叠
  • 后接若干全连接层
  • 最终输出分类概率

💡 设计建议(吴恩达经验)

  1. 不要盲目调参:参考已有成功架构(如 LeNet-5, AlexNet, VGG)
  2. 复用成熟框架:如 TensorFlow, PyTorch 中预定义模型
  3. 关注模式而非细节:理解“卷积→池化→全连接”的流程
  4. 优先考虑可复现性:从文献中找灵感,验证效果

🧠 为什么使用卷积?

虽然本节课未展开,但可提前预告:

卷积的优势:

  1. 局部感知:利用局部感受提取特征
  2. 权值共享:同一过滤器在整个图像上滑动,减少参数
  3. 平移不变性:对象位置变化不影响识别
  4. 层次化特征提取:低层提取边缘、角点;高层提取复杂结构

📘 学习建议

推荐练习:

  1. 手动计算每一层的输出尺寸和参数数量
  2. 使用 Python 实现该网络(PyTorch / TensorFlow)
  3. 对比 LeNet-5 结构(注意:LeNet-5 输入为 28x28x1,黑白图)

🧩 附录:完整公式汇总(LaTeX 兼容)

% 输出尺寸计算(卷积)
H' = \frac{H - f}{s} + 1 \\
W' = \frac{W - f}{s} + 1

% 池化输出尺寸
H' = \frac{H - f}{s} + 1 \quad (\text{同卷积})

% 卷积层参数数
\text{params}_{\text{conv}} = f^2 \cdot C_{\text{in}} \cdot C_{\text{out}} + C_{\text{out}}

% 全连接层参数数
\text{params}_{\text{fc}} = d \cdot k + k = k(d + 1)

% 激活值大小
\text{activation size} = H \cdot W \cdot C

✅ 总结

主题 内容
网络类型 典型 CNN(受 LeNet-5 启发)
输入 $32 \times 32 \times 3$ RGB 图像
输出 10 类 softmax(0-9 数字识别)
关键模块 卷积、池化、全连接、softmax
参数分布 大部分参数集中在全连接层
设计模式 [Conv + Pool] × 2 → FC × 2 → Softmax
重要原则 层级化特征提取、参数共享、降维处理