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
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 架构模式
1
Input → [Conv → Pool] × n → [FC] × m → Softmax
即:
- 多组“卷积 + 池化”堆叠
- 后接若干全连接层
- 最终输出分类概率
💡 设计建议(吴恩达经验)
- 不要盲目调参:参考已有成功架构(如 LeNet-5, AlexNet, VGG)
- 复用成熟框架:如 TensorFlow, PyTorch 中预定义模型
- 关注模式而非细节:理解“卷积→池化→全连接”的流程
- 优先考虑可复现性:从文献中找灵感,验证效果
🧠 为什么使用卷积?
虽然本节课未展开,但可提前预告:
卷积的优势:
- 局部感知:利用局部感受提取特征
- 权值共享:同一过滤器在整个图像上滑动,减少参数
- 平移不变性:对象位置变化不影响识别
- 层次化特征提取:低层提取边缘、角点;高层提取复杂结构
📘 学习建议
推荐练习:
- 手动计算每一层的输出尺寸和参数数量
- 使用 Python 实现该网络(PyTorch / TensorFlow)
- 对比 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 |
| 重要原则 | 层级化特征提取、参数共享、降维处理 |