卷积(下):如何用卷积为计算机"开天眼"?
一、卷积类型总览
基于标准卷积衍生出多种卷积方式,各有所长:
|
|
|
|---|---|
| 深度可分离卷积 |
|
| 空洞卷积 |
|
|
|
|
|
|
|
|
|
|
|
|
|
本文重点讲解 深度可分离卷积 和 空洞卷积。[pdf_10]
二、深度可分离卷积(Depthwise Separable Convolution)
1. 提出背景
随着深度学习发展,VGG、ResNet、SENet、DenseNet 等很深很宽的网络模型被提出,这些模型虽然精度高,但有速度慢、参数量大的通病,无法直接部署到移动终端。
深度可分离卷积是谷歌在 MobileNet v1 中提出的一种轻量化卷积,在效果近似相同的情况下,需要的计算量更少。[pdf_10]
2. 组成结构
深度可分离卷积由两部分组合而成:
深度可分离卷积 = Depthwise(DW)卷积 + Pointwise(PW)卷积
(1)DW 卷积(深度卷积)
-
m 个卷积核(m = 输入特征图通道数),每个卷积核中通道数为 1 -
分别与输入特征图对应通道做卷积运算 -
输出为 m 个通道的特征图 -
通常卷积核大小为 3×3
(2)PW 卷积(逐点卷积)
-
本质上是 n 个 1×1 卷积核,每个卷积核中有 m 个通道 -
主要作用:将 DW 输出的 m 个特征图结合在一起,输出 n 个通道的特征图 -
1×1 卷积的主要作用是升维与降维[pdf_10]
3. 计算量对比
前提条件:输入 m 通道,卷积核 k×k,输出特征图尺寸 (n, h′, w′)
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
计算量比值:
深度可分离卷积 ≈ 1 1
──────────────── ─── + ───
标准卷积 n k²
结论:深度可分离卷积的计算量大约为普通卷积计算量的 1/k²。以 3×3 卷积核为例,计算量约为标准卷积的 1/9。[pdf_10]
4. PyTorch 实现
第一步:DW 卷积
import torch
import torch.nn as nn
# 生成一个三通道的 5x5 特征图
x = torch.rand((3, 5, 5)).unsqueeze(0)
print(x.shape) # torch.Size([1, 3, 5, 5])
# DW 中,输入通道数与输出通道数一样
in_channels_dw = x.shape[1]
out_channels_dw = x.shape[1]
# DW 卷积核一般为 3x3
kernel_size = 3
stride = 1
# groups 参数与输入通道数一样
dw = nn.Conv2d(in_channels_dw, out_channels_dw, kernel_size, stride, groups=in_channels_dw)
DW 卷积注意事项:
-
DW 中,输入通道数与输出通道数相同 -
一般 DW 卷积核为 3×3 -
DW 卷积的 groups 参数与输入通道数相同[pdf_10]
第二步:PW 卷积
in_channels_pw = out_channels_dw
out_channels_pw = 4
kernel_size_pw = 1
pw = nn.Conv2d(in_channels_pw, out_channels_pw, kernel_size_pw, stride)
out = pw(dw(x))
print(out.shape)
PW 卷积的 groups 使用默认值(groups=1),实现标准 1×1 卷积。[pdf_10]
三、groups 参数详解
|
|
|
|
|---|---|---|
| groups=1 |
|
|
| groups≠1 |
|
|
| groups=in_channels |
|
|
注意事项:
-
groups 不为 1 时,必须能整除 in_channels 和 out_channels。[pdf_10]
四、空洞卷积(Dilated/Atrous Convolution)
1. 应用背景
-
常用于图像分割任务(pixel-wise 输出,每个像素都要预测) -
传统模型的问题:多层卷积和 pooling 后特征图变小,需要上采样/反卷积恢复,导致信息损失,小物体尤为严重
2. 核心优势
★不需要缩小特征图,也可以获得更大的感受野。[pdf_10]
3. 感受野(Receptive Field)
定义:在卷积神经网络中,不同层的特征图相对于原图的计算区域,这个区域称为感受野。
|
|
|
|---|---|
| 越大 |
|
| 越小 |
|
示例图解:
-
原图 6×6 → 第一层 3×3 卷积 → 输出感受野为 3(每个值由原图 3×3 区域计算) -
第二层 3×3 卷积 → 输出 2×2 → 感受野变为 5(原图中更大的区域)[pdf_10]
4. 计算方式与 dilation 参数
-
计算方式与普通卷积一样,只是将卷积核以一定比例拆分开来 -
实现方式:用 0 来充填卷积核 -
分开的比例称为扩张率,对应 Conv2d 中的 dilation 参数 -
dilation 默认为 1,可以是 int 或 tuple(tuple 时第一位代表行,第二位代表列)[pdf_10]
五、PyTorch Conv2d 参数总结表
|
|
|
|
|---|---|---|
| in_channels |
|
|
| out_channels |
|
|
| kernel_size |
|
|
| stride |
|
|
| padding |
|
|
| dilation |
|
|
| groups |
|
|
| bias |
|
|
[pdf_10]
六、其他卷积类型简介
|
|
|
|---|---|
| 转置卷积 |
|
| 残差卷积块 |
|
| Inception 模块 |
|
| SE 块 |
|
[pdf_10]
七、核心要点总结
-
深度可分离卷积 = DW 卷积(深度卷积)+ PW 卷积(逐点 1×1 卷积),计算量约为标准卷积的 1/k²,用于轻量化模型。 -
groups 参数:groups=1 为标准卷积,groups=in_channels 为 DW 卷积,需能整除 in_channels 和 out_channels。 -
空洞卷积:通过 dilation 参数实现,不缩小特征图也能增大感受野,常用于图像分割。 -
感受野:特征图相对于原图的计算区域,越大语义越抽象,越小细节越丰富。 -
经验分享:轻量化模型可将卷积层替换为深度可分离卷积;图像分割可将靠后层替换为空洞卷积。[pdf_10]
八、每课一练
问题:随机生成一个 3 通道的 128×128 的特征图,然后创建一个有 10 个卷积核且卷积核尺寸为 3×3(DW 卷积)的深度可分离卷积,对输入数据进行卷积计算。
参考解答:
import torch
import torch.nn as nn
# 生成一个三通道的 128x128 特征图
x = torch.rand((3, 128, 128)).unsqueeze(0)
print(x.shape) # torch.Size([1, 3, 128, 128])
# DW 卷积:输入通道数与输出通道数一样
in_channels_dw = x.shape[1]
out_channels_dw = x.shape[1]
kernel_size = 3
stride = 1
dw = nn.Conv2d(in_channels_dw, out_channels_dw, kernel_size, stride, groups=in_channels_dw)
# PW 卷积:将 DW 输出合并为 10 个通道
in_channels_pw = out_channels_dw
out_channels_pw = 10
kernel_size_pw = 1
pw = nn.Conv2d(in_channels_pw, out_channels_pw, kernel_size_pw, stride)
output = pw(dw(x))
print(output.shape)
# 输出:torch.Size([1, 10, 126, 126])
[pdf_10]
九、小结
-
深度可分离卷积:DW(每组独立的深度卷积)+ PW(1×1 逐点卷积),计算量大幅降低,适合移动端轻量化模型。 -
groups 参数:控制分组卷积,groups=1 为标准卷积,groups=in_channels 为 DW 卷积。 -
空洞卷积:通过 dilation 参数以 0 填充卷积核,在不缩小特征图的情况下增大感受野,常用于图像分割。 -
感受野:是关键概念,越大语义越抽象,越小细节越丰富。 -
Conv2d 完整参数:in_channels、out_channels、kernel_size、stride、padding、dilation、groups、bias。 -
核心原则:根据任务需求选择合适的卷积变体,轻量化用深度可分离卷积,分割用空洞卷积。

