在 PyTorch 中,nn.Conv2d
是一个常用的二维卷积层,用于处理图像等二维数据。下面是对其参数的详细介绍:
定义
torch.nn.Conv2d(
in_channels,
out_channels,
kernel_size,
stride=1,
padding=0,
dilation=1,
groups=1,
bias=True,
padding_mode='zeros'
)
参数详解
1. in_channels
- 含义:输入特征图的通道数。
- 解释:如果输入数据是 RGB 图像,
in_channels
通常为 3;如果是灰度图像,则为 1。 - 示例:
- RGB 图像输入:
in_channels=3
- 单通道灰度图输入:
in_channels=1
- RGB 图像输入:
2. out_channels
- 含义:卷积操作输出特征图的通道数。
- 解释:通过卷积核的数量控制输出的通道数。通常越多的通道数可以捕捉到更多特征。
- 示例:
- 如果设置
out_channels=64
,卷积层会生成 64 个特征图。
- 如果设置
3. kernel_size
- 含义:卷积核的大小。
- 类型:
- 单个整数:表示卷积核的宽和高相同,例如
kernel_size=3
表示卷积核大小为3x3
。 - 元组
(height, width)
:表示卷积核的高度和宽度分别为指定值,例如kernel_size=(3, 5)
。
- 单个整数:表示卷积核的宽和高相同,例如
- 示例:
kernel_size=3
表示 3x3 卷积核。kernel_size=(3, 5)
表示 3 高 x 5 宽的卷积核。
4. stride
- 含义:步幅,卷积核在输入特征图上滑动的步长。
- 默认值:
1
- 类型:
- 单个整数:表示行和列的步幅相同,例如
stride=2
。 - 元组
(stride_height, stride_width)
:分别指定行和列的步幅。
- 单个整数:表示行和列的步幅相同,例如
- 作用:增大步幅会减小输出特征图的尺寸。
- 示例:
stride=1
:卷积核每次移动 1 个像素。stride=2
:卷积核每次移动 2 个像素。
5. padding
- 含义:填充,控制在输入特征图周围填充的像素数。
- 默认值:
0
- 类型:
- 单个整数:所有方向填充相同的像素,例如
padding=1
。 - 元组
(pad_height, pad_width)
:指定高度和宽度方向的填充。 - 字符串
'same'
:自动计算填充以保证输出特征图大小不变。
- 单个整数:所有方向填充相同的像素,例如
- 作用:
- 防止特征图尺寸过快减小。
- 保留边缘信息。
- 示例:
padding=1
:在特征图每边添加 1 个像素。padding='same'
:特征图输出尺寸与输入尺寸相同。
6. dilation
- 含义:扩张卷积,控制卷积核元素之间的间隔。
- 默认值:
1
- 作用:增大感受野(视野)而不增加参数。
- 示例:
dilation=1
:普通卷积。dilation=2
:卷积核元素间隔 1 个像素,相当于感受野增大为普通卷积的 2 倍。
7. groups
- 含义:将输入通道分成若干组,每组使用独立的卷积核。
- 默认值:
1
- 作用:
groups=1
:普通卷积,所有通道共享一个卷积核组。groups=in_channels
:每个输入通道使用单独的卷积核(深度卷积,常用于 MobileNet 等轻量模型)。
- 示例:
groups=1
:标准卷积。groups=2
:将输入通道分成 2 组,每组单独卷积。
8. bias
- 含义:是否为卷积操作添加偏置项。
- 默认值:
True
- 作用:如果设置为
False
,则不会有偏置参数(通常在有 BatchNorm 层时可以省略偏置)。 - 示例:
bias=True
:包含偏置项。bias=False
:不包含偏置项。
9. padding_mode
- 含义:控制填充的方式。
- 默认值:
'zeros'
- 可选值:
'zeros'
:用零填充(默认)。'reflect'
:使用输入的镜像值填充。'replicate'
:使用输入边界值填充。'circular'
:使用循环填充。
- 示例:
padding_mode='zeros'
:在输入边界填充零。padding_mode='reflect'
:在输入边界进行镜像填充。
计算输出特征图大小
输出的宽度和高度可通过公式计算:
示例代码
import torch
import torch.nn as nn
# 定义卷积层
conv = nn.Conv2d(
in_channels=3,
out_channels=6,
kernel_size=3,
stride=1,
padding=1,
bias=True
)
# 输入张量 (N, C, H, W) = (1, 3, 32, 32)
x = torch.rand(1, 3, 32, 32)
# 前向传播
output = conv(x)
print("输入形状:", x.shape)
print("输出形状:", output.shape)