大数跨境

卷积(下):如何用卷积为计算机"开天眼"?

卷积(下):如何用卷积为计算机"开天眼"? 知识代码AI
2026-08-26
8
导读:卷积(下):如何用卷积为计算机"开天眼"?

卷积(下):如何用卷积为计算机"开天眼"?


一、卷积类型总览

基于标准卷积衍生出多种卷积方式,各有所长:

卷积类型
主要用途
深度可分离卷积
用于轻量化模型
空洞卷积
常用于图像分割
转置卷积
常用于图像分割
残差卷积块
提高网络精度的一种组合
Inception 模块
提高网络精度的一种组合
SE 块
提高网络精度的一种组合

本文重点讲解 深度可分离卷积 和 空洞卷积。[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′)

卷积类型
计算量公式
标准卷积
k × k × m × n × h′ × w′
DW 卷积
k × k × m × h′ × w′
PW 卷积
1 × 1 × m × n × h′ × w′
深度可分离卷积(DW+PW)
k × k × m × h′ × w′ + 1 × 1 × m × 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((355)).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 卷积注意事项:

  1. DW 中,输入通道数与输出通道数相同
  2. 一般 DW 卷积核为 3×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 取值
含义
说明
groups=1
标准卷积
nn.Conv2d 的默认值
groups≠1
分组卷积
将输入特征图分成 groups 个组,每组有自己对应的卷积核,输出也有 groups 个分组
groups=in_channels
DW 卷积
每个通道单独卷积

注意事项

  • 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
int
输入特征图中的通道数
out_channels
int
输出特征图的通道数(即卷积核个数)
kernel_size
int / tuple
卷积核的尺寸
stride
int / tuple
卷积核滑动的步长,默认 1。padding='valid'/'same' 时 stride 必须为 1
padding
str / int / tuple
补零方式
dilation
int / tuple
空洞率(扩张率),默认 1
groups
int
将输入特征图分组进行计算。深度可分离卷积中,等于输入通道数
bias
bool
是否加偏移项,默认 True,一般都会加

[pdf_10]


六、其他卷积类型简介

卷积类型
用途说明
转置卷积
常用于图像分割,实现上采样
残差卷积块
提高网络精度的一种组合方式
Inception 模块
多尺度特征提取,提高网络精度
SE 块
通道注意力机制,提高网络精度

[pdf_10]


七、核心要点总结

  1. 深度可分离卷积 = DW 卷积(深度卷积)+ PW 卷积(逐点 1×1 卷积),计算量约为标准卷积的 1/k²,用于轻量化模型。
  2. groups 参数:groups=1 为标准卷积,groups=in_channels 为 DW 卷积,需能整除 in_channels 和 out_channels。
  3. 空洞卷积:通过 dilation 参数实现,不缩小特征图也能增大感受野,常用于图像分割。
  4. 感受野:特征图相对于原图的计算区域,越大语义越抽象,越小细节越丰富。
  5. 经验分享:轻量化模型可将卷积层替换为深度可分离卷积;图像分割可将靠后层替换为空洞卷积。[pdf_10]

八、每课一练

问题:随机生成一个 3 通道的 128×128 的特征图,然后创建一个有 10 个卷积核且卷积核尺寸为 3×3(DW 卷积)的深度可分离卷积,对输入数据进行卷积计算。

参考解答

import torch
import torch.nn as nn

# 生成一个三通道的 128x128 特征图
x = torch.rand((3128128)).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]


九、小结

  1. 深度可分离卷积:DW(每组独立的深度卷积)+ PW(1×1 逐点卷积),计算量大幅降低,适合移动端轻量化模型。
  2. groups 参数:控制分组卷积,groups=1 为标准卷积,groups=in_channels 为 DW 卷积。
  3. 空洞卷积:通过 dilation 参数以 0 填充卷积核,在不缩小特征图的情况下增大感受野,常用于图像分割。
  4. 感受野:是关键概念,越大语义越抽象,越小细节越丰富。
  5. Conv2d 完整参数:in_channels、out_channels、kernel_size、stride、padding、dilation、groups、bias。
  6. 核心原则:根据任务需求选择合适的卷积变体,轻量化用深度可分离卷积,分割用空洞卷积。


【声明】内容源于网络
0
0
知识代码AI
技术基底 机器视觉全栈 × 光学成像 × 图像处理算法 编程栈 C++/C#工业开发 | Python智能建模 工具链 Halcon/VisionPro工业部署 | PyTorch/TensorFlow模型炼金术 | 模型压缩&嵌入式移植
内容 403
粉丝 0
知识代码AI 技术基底 机器视觉全栈 × 光学成像 × 图像处理算法 编程栈 C++/C#工业开发 | Python智能建模 工具链 Halcon/VisionPro工业部署 | PyTorch/TensorFlow模型炼金术 | 模型压缩&嵌入式移植
总阅读6.6k
粉丝0
内容403