文章目录
-
- 一、基础概念回顾
- 二、卷积层各组件详解
-
- [1. 多通道卷积(3D卷积)](#1. 多通道卷积(3D卷积))
- [2. 步长 (Stride)](#2. 步长 (Stride))
- [3. 填充 (Padding)](#3. 填充 (Padding))
- [4. 膨胀卷积 (Dilated/Atrous Convolution)](#4. 膨胀卷积 (Dilated/Atrous Convolution))
- [5. 分组卷积 (Grouped Convolution)](#5. 分组卷积 (Grouped Convolution))
- 三、综合实例:人脸识别系统
- 四、可视化理解
- 五、常见问答
-
- [Q1: 为什么卷积核通常是奇数尺寸?](#Q1: 为什么卷积核通常是奇数尺寸?)
- [Q2: 1×1卷积有什么用?](#Q2: 1×1卷积有什么用?)
- [Q3: 如何选择卷积核尺寸?](#Q3: 如何选择卷积核尺寸?)
- [Q4: 池化层 vs 步长>1的卷积?](#Q4: 池化层 vs 步长>1的卷积?)
- 总结
一、基础概念回顾
什么是卷积层?
核心思想 :局部感知 + 参数共享
- 局部感知:不像全连接层那样看整张图,而是每次只看图像的一小块区域
- 参数共享:用同一个"小探测器"(卷积核)扫描整张图的不同位置
生活比喻:像用手电筒在黑暗房间里寻找物品
- 手电筒的光斑 = 卷积核的感知范围
- 移动手电筒扫描 = 卷积核在图像上滑动
- 看到的不同物品 = 提取的不同特征
二、卷积层各组件详解
1. 多通道卷积(3D卷积)
技术定义:
- 输入:
[高度, 宽度, 输入通道数] - 卷积核:
[核高度, 核宽度, 输入通道数, 输出通道数] - 输出:
[输出高度, 输出宽度, 输出通道数]
生活实例 :蛋糕制作机
输入原料:面粉层 + 鸡蛋层 + 糖层(3个输入通道)
制作工具:三层模具同时压下去(3D卷积核)
输出结果:一个完整的小蛋糕(1个输出特征)
多个工具:不同形状的模具 → 不同种类的蛋糕(多个输出通道)
数学示例:
python
# 假设输入是3通道的5×5图像
输入 = [
[[1,2,3], [4,5,6], [7,8,9], ...], # 红色通道
[[0,1,2], [3,4,5], [6,7,8], ...], # 绿色通道
[[2,3,4], [5,6,7], [8,9,0], ...] # 蓝色通道
]
# 3D卷积核(3×3×3)
卷积核 = [
# 对红色通道的权重
[[0,1,0], [1,1,1], [0,1,0]],
# 对绿色通道的权重
[[1,0,1], [0,1,0], [1,0,1]],
# 对蓝色通道的权重
[[0,0,0], [1,1,1], [0,0,0]]
]
# 计算:三个通道分别卷积后相加
结果 = 红通道卷积 + 绿通道卷积 + 蓝通道卷积
2. 步长 (Stride)
技术定义:
- 步长S=1:每次移动1个像素(最常用)
- 步长S=2:每次移动2个像素(下采样)
生活实例 :扫地机器人
小步长(S=1):机器人慢慢移动,每个地方都仔细清扫
→ 输出详细地图(特征图尺寸大)
大步长(S=2):机器人快速移动,只清扫关键区域
→ 输出简化地图(特征图尺寸小)
计算示例:
python
输入尺寸: 7×7 (H×W)
卷积核: 3×3
步长=1 → 输出尺寸: (7-3)/1 + 1 = 5×5
步长=2 → 输出尺寸: (7-3)/2 + 1 = 3×3
步长=3 → 输出尺寸: (7-3)/3 + 1 = 2×2 # 向下取整
3. 填充 (Padding)
两种主要模式:
- 'valid':无填充,输出尺寸会缩小
- 'same':填充使得输出尺寸与输入相同(当步长=1时)
生活实例 :相框装裱照片
原始照片:需要裁剪边缘才能放进相框 → 'valid'卷积
(信息可能丢失,尺寸变小)
带边框的照片:先给照片加白色边框,再放进相框 → 'same'卷积
(保留边缘信息,尺寸不变)
填充方法示例:
python
# 输入5×5,卷积核3×3,步长=1
输入:
[[1,2,3,4,5],
[6,7,8,9,0],
[1,2,3,4,5],
[6,7,8,9,0],
[1,2,3,4,5]]
# 'same'填充:在周围加一圈0
填充后:
[[0,0,0,0,0,0,0],
[0,1,2,3,4,5,0],
[0,6,7,8,9,0,0],
[0,1,2,3,4,5,0],
[0,6,7,8,9,0,0],
[0,1,2,3,4,5,0],
[0,0,0,0,0,0,0]]
# 卷积后输出尺寸仍是5×5
4. 膨胀卷积 (Dilated/Atrous Convolution)
技术定义:
- 在卷积核元素间插入"空洞"
- 膨胀率r=1:普通卷积
- 膨胀率r=2:元素间有1个空洞
生活实例 :渔网捕鱼
普通渔网(r=1):网眼密,捕捉小鱼(局部细节)
膨胀渔网(r=2):网眼稀,捕捉大鱼(大范围特征)
超级膨胀渔网(r=4):超大网眼,捕捉鲸鱼(极大感受野)
视觉对比:
普通卷积核(r=1): 膨胀卷积核(r=2):
● ● ● ● ● ●
● ● ● ●
● ● ● ● ● ●
感受野: 3×3 感受野: 5×5
参数: 9个 参数: 9个(相同!)
代码示例:
python
import torch
import torch.nn as nn
# 普通卷积
conv_normal = nn.Conv2d(3, 16, kernel_size=3, dilation=1)
# 感受野: 3×3
# 膨胀卷积
conv_dilated = nn.Conv2d(3, 16, kernel_size=3, dilation=2)
# 实际感受野: 5×5 (但参数仍是3×3=9个)
# 膨胀卷积计算位置
# 膨胀率=2时,实际采样的位置:
# (0,0), (0,2), (0,4)
# (2,0), (2,2), (2,4)
# (4,0), (4,2), (4,4)
5. 分组卷积 (Grouped Convolution)
技术定义:
- 将输入通道分为g组
- 每组独立卷积,结果拼接
- 极端情况:分组数=通道数 → 深度可分离卷积
生活实例 :专家团队协作
输入:一本百科全书(256个知识点)
普通卷积:1个全才专家处理所有256个知识点
→ 工作量大,容易出错
分组卷积(g=4):4个专家团队,每组64个知识点
Team A: 数学物理
Team B: 化学生物
Team C: 历史地理
Team D: 文学艺术
→ 各展所长,效率更高
参数对比:
python
输入: 256通道
输出: 256通道
卷积核: 3×3
# 普通卷积
参数量 = 3×3×256×256 = 589,824
# 分组卷积(g=4)
每组输入通道 = 256/4 = 64
每组输出通道 = 256/4 = 64
参数量 = 4 × (3×3×64×64) = 147,456
# 参数减少到1/4!
三、综合实例:人脸识别系统
让我们用一个完整的人脸识别例子串联所有概念:
python
# 模拟人脸识别CNN的卷积层设计
人脸图像 = "3通道RGB, 224×224像素"
# 第1层:基础特征提取
卷积层1 = 多通道卷积(
输入通道=3,
输出通道=64,
核大小=7×7,
步长=2, # 快速下采样
填充='same' # 保留边缘信息
)
# 作用:检测边缘、颜色等基础特征
# 第2层:细节特征提取
卷积层2 = 分组卷积(
输入通道=64,
输出通道=128,
核大小=3×3,
分组数=4, # 4个专家团队分工
步长=1,
填充='same'
)
# 作用:分组提取眼、鼻、口、轮廓等不同特征
# 第3层:大范围特征提取
卷积层3 = 膨胀卷积(
输入通道=128,
输出通道=256,
核大小=3×3,
膨胀率=2, # 扩大感受野
步长=1
)
# 作用:捕捉脸部整体结构、相对位置关系
# 最终:得到高级特征表示,用于人脸比对
四、可视化理解
卷积过程动画想象
输入图像: [███图像内容███]
卷积核: [◎探测器◎]
步长=1时:
位置1: [◎探测器◎]███图像内容███
位置2: █[◎探测器◎]██图像内容███
位置3: ██[◎探测器◎]█图像内容███
...
不同卷积对比图
普通卷积: █████ → 逐点密集扫描
膨胀卷积: █ █ █ → 跳点扫描,范围大
分组卷积: █|█|█ → 分组并行处理
五、常见问答
Q1: 为什么卷积核通常是奇数尺寸?
A: 奇数尺寸有中心点,便于对称填充和定位。常见尺寸:1×1, 3×3, 5×5, 7×7。
Q2: 1×1卷积有什么用?
A: 1×1卷积是"通道混合器":
- 降维/升维(改变通道数)
- 增加非线性(配合激活函数)
- 极低成本的特征重组
Q3: 如何选择卷积核尺寸?
A: 经验法则:
- 浅层:大核(7×7, 5×5)捕捉大范围基础特征
- 深层:小核(3×3, 1×1)提取精细特征
- 现代趋势:多用3×3小核堆叠(VGG风格)
Q4: 池化层 vs 步长>1的卷积?
A: 两者都下采样,但:
- 池化层:无参数,更鲁棒(最大池化抗噪声)
- 带步长卷积:有参数,可学习下采样方式
- 现代网络:倾向用带步长卷积替代池化层
总结
卷积层是CNN的核心引擎,理解它的各个组件就像理解汽车的各个系统:
- 多通道:多感官协同工作
- 步长:移动速度
- 填充:边界处理策略
- 膨胀:视野范围
- 分组:并行处理能力
关键思想 :所有这些设计都是在平衡:
- 感受野大小 vs 计算成本
- 特征保留 vs 下采样需求
- 参数数量 vs 模型容量