文章

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

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

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

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


🎯 课程目标

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


🔧 网络结构概览

层名类型超参数输出形状激活值大小参数数量
Input输入-(32,32,3)30720
CONV1卷积$f=5, s=1, p=0$, 过滤器数 = 6(28,28,6)6,272208
POOL1最大池化$f=2, s=2$(14,14,6)1,5680
CONV2卷积$f=5, s=1, p=0$, 过滤器数 = 16(10,10,16)1,600416
POOL2最大池化$f=2, s=2$(5,5,16)4000
FC3全连接120 个神经元(120,1)12048,001
FC4全连接84 个神经元(84,1)8410,081
Softmax分类输出-(10,1)10841

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


🧱 基本构造模块解析

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 参数456208
POOL1 激活值11761568
CONV2 参数416416 ✅(合理)

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


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$
POOL10
CONV2$(5×5×6)×16 + 16 = 2416$
POOL20
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 架构模式

1
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 兼容)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
% 输出尺寸计算(卷积)
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
重要原则层级化特征提取、参数共享、降维处理
本文由作者按照 CC BY 4.0 进行授权