文章目录
逐通道卷积(Pointwise Convolution,1x1 卷积)
逐通道卷积(Pointwise Convolution),也称为 1x1 卷积,是一种特殊的卷积操作,其中卷积核的大小为 1x1。
这种卷积操作不会覆盖空间维度(height 和 width),而是只作用于每个位置上的所有通道,这使得逐通道卷积主要用于调整通道数量或整合通道信息。
主要作用
-
降维( dimension reductionality ): 比如,一张500 * 500且厚度depth为100 的图片在20个filter上做1*1的卷积,那么结果的大小为500×500×20。就是改变了输入和输出的通道数,可以减少参数。
-
增加非线性:卷积层之后经过激励层,1*1的卷积在前一层的学习表示上添加了非线性激励( non-linear activation ),提升网络的表达能力;很明显,增加了非线性,因为相当于又进行了一次运算。
逐通道卷积的操作过程
逐通道卷积对输入特征图的每个空间位置都使用一个 1x1 的卷积核来进行计算,因此该操作不改变特征图的空间分辨率(height 和 width),而是针对通道进行操作。
例如,假设输入特征图的大小为 [height, width, channels_in]
,逐通道卷积会:
-
仅在每个空间位置的通道维度上进行加权求和,输出为
[height, width, channels_out]
。 -
通过多个 1x1 卷积核堆叠,实现对所有通道的线性组合,从而调整通道数量。
优势
-
降维或升维:可以调整通道数,例如从较高的通道数降维为较低的通道数,或从较低的通道数升维为较高的通道数。
-
减少计算量:在深层网络中,先通过 1x1 卷积减少通道数,再应用较大卷积核,可以降低计算复杂度。
-
融合通道信息:通过对不同通道进行线性组合,逐通道卷积可以聚合通道之间的信息,从而提取到更丰富的特征。
代码示例
在这个例子中,1x1
卷积调整了通道数,从 64 转换为 128,但空间分辨率(height 和 width)保持不变(即32x32)。
import torch
import torch.nn as nn
# 定义1x1逐通道卷积
conv1x1 = nn.Conv2d(in_channels=64, out_channels=128, kernel_size=1)
# 输入一个大小为 (batch_size, 64, height, width) 的特征图
input_tensor = torch.randn(1, 64, 32, 32)
output_tensor = conv1x1(input_tensor)
print("输出特征图形状:", output_tensor.shape) # (1, 128, 32, 32)
典型应用
-
通道整合:用于将特征进行通道混合,常用于 MobileNet 和 ResNet 等网络结构。
-
深度可分离卷积:在深度可分离卷积中,逐通道卷积和深度卷积结合,形成一种高效的特征提取方式,显著减少参数和计算量。
-
调整特征图维度:在网络的不同层之间,通过 1x1 卷积来匹配不同层的通道数。
膨胀卷积(Dilated Convolution)
参考:空洞卷积(膨胀卷积)的相关知识以及使用建议(HDC原则)
膨胀卷积(Dilated Convolution),又称为扩张卷积或空洞卷积,是一种特殊的卷积操作,它通过在卷积核的元素之间插入间隔(称为膨胀率或扩张率)来扩大感受野。这样一来,膨胀卷积在不增加参数数量和计算量的前提下可以获取更大的上下文信息。
在nn.conv2d中由dilation参数决定。
主要作用
-
增大感受野
-
保持原输入特征图的高度和宽度
工作原理
在标准卷积中,每个卷积核会直接作用于相邻的输入像素。而在膨胀卷积中,通过在卷积核元素之间引入空隙,使得卷积核可以“跳跃”着查看更远的像素,感受野因此被扩大。
例如,假设一个 3x3
的标准卷积核作用在输入特征图上。对于膨胀率为 2
的膨胀卷积,卷积核会在每个元素之间留出 1 个空位,相当于“跳”过一个像素。这种操作使得卷积核感知更大区域的特征,而无需增加参数。