-
class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')
in_channels
:输入通道的数量,对应于输入的图像或特征图的深度。out_channels
:输出通道的数量,表示卷积核(滤波器)的数量,也即卷积操作后生成的特征图的深度。kernel_size
:卷积核的大小,可以是一个整数表示正方形卷积核,也可以是一个元组(h, w)
表示高度和宽度不同的卷积核。stride
:卷积的步长,默认为 1,表示卷积核在输入上滑动的步长。padding
:零填充的大小,用于控制输入特征图边界的处理。dilation
:卷积核的扩张率,默认为 1。groups
:分组卷积的数量。默认为 1,表示标准卷积。当groups
不等于 1 时,输入通道被分为groups
份,每份进行卷积操作后再进行拼接。bias
:是否包含偏置项,默认为 True。padding_mode
:填充模式,默认为 'zeros',表示零填充。
普通卷积(Standard Convolution):
-
概念: 在普通卷积中,每个卷积核在整个输入上滑动,通过对输入的局部区域进行加权求和来生成输出。
-
输入层: 三维张量,通常表示为 (输入数据长, 输入数据宽,输入数据的通道数)。
-
卷积核: 三维张量,通常表示为(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')。
-
输出层: 三维张量,通常表示为 (输出数据长, 输出数据宽,输出数据的通道数)。
2. 分组卷积(Grouped Convolution):
与普通卷积类似,但 groups
参数用于指定输入通道被分成的组数。
-
概念: 分组卷积将输入通道划分成若干组,每组进行卷积操作,然后将不同组的输出连接在一起。
-
输入层: 三维张量,通常表示为 (输入数据长, 输入数据宽,输入数据的通道数)。
-
卷积核: 三维张量,通常表示为(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=groups, bias=True, padding_mode='zeros')。
-
输出层: 三维张量,通常表示为 (输出数据长, 输出数据宽,输出数据的通道数)。
3. 深度卷积(Depthwise Convolution):
in_channels
和out_channels
相等,表示每个输入通道都有一个对应的卷积核。groups
设置为in_channels
,实现深度卷积。
-
概念: 深度卷积是分组卷积,其中每个输入通道与一个单独的卷积核进行卷积,然后将不同通道的输出连接在一起。
-
输入层: 三维张量,通常表示为 (输入数据长, 输入数据宽,输入数据的通道数)。
-
卷积核: 三维张量,通常表示为(in_channels, out_channels=in_channels, kernel_size, stride=1, padding=0, dilation=1, groups=in_channels, bias=True, padding_mode='zeros')。
-
输出层: 三维张量,通常表示为 (输出数据长, 输出数据宽,输出数据的通道数)。
4. 逐点卷积(Pointwise Convolution):
- 通常通过设置
kernel_size
为 1 来实现,即 (1, 1)。 - 可以在深度卷积之后应用逐点卷积。
-
概念: 逐点卷积使用 1x1 大小的卷积核进行卷积,它可以用来改变通道的数量,进行通道间的线性组合。
-
输入层: 三维张量,通常表示为 (输入数据长, 输入数据宽,输入数据的通道数)。
-
卷积核: 三维张量,通常表示为(in_channels, out_channels, kernel_size=(1, 1), stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')。
-
输出层: 三维张量,通常表示为 (输出数据长, 输出数据宽,输出数据的通道数)。
5. 深度可分离卷积(Depthwise Separable Convolution):
可以先应用深度卷积,然后应用逐点卷积。
-
概念: 深度可分离卷积首先对每个输入通道进行深度卷积,然后通过逐点卷积将通道间的信息整合起来。
-
import torch.nn as nn
class DepthwiseSeparableConv2d(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0):
super(DepthwiseSeparableConv2d, self).__init__() -
先进行深度卷积操作
# Depthwise Convolution
self.depthwise = nn.Conv2d(in_channels, out_channels=in_channels, kernel_size, stride=1, padding=0, dilation=1, groups=in_channels, bias=True, padding_mode='zeros') -
再进行逐点卷积操作
# Pointwise Convolution
self.pointwise = nn.Conv2d(in_channels, out_channels, kernel_size=(1, 1), stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros')def forward(self, x):
x = self.depthwise(x)
x = self.pointwise(x)
return x