该函数的官方文档:
https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html#torch.nn.Conv2d
torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True, padding_mode='zeros', device=None, dtype=None)
参数
以下是参数释义:
- in_channels (int) – 输入图像的通道数
- out_channels (int) – 卷积生成的输出通道数
- kernel_size (int 或 tuple) – 卷积核的大小
- stride (int 或 tuple, 可选) – 卷积的步幅。默认值:1
- padding (int, tuple 或 str, 可选) – 在输入的四周添加的填充。默认值:0。padding=0表示在输入的周围不添加填充;padding=1表示在输入的四周添加0填充。
- padding_mode (str, 可选) – 填充模式,可以为 'zeros'(零填充)、'reflect'(用输入的反射值填充)、'replicate'(复制输入边缘的值填充)或 'circular'(循环填充)。默认值:'zeros'
- dilation (int 或 tuple, 可选) – 卷积核元素之间的间隔。默认值:1
- groups (int, 可选) – 从输入通道到输出通道的分组连接数。默认值:1
- bias (bool, 可选) – 如果为 True,则为输出添加可学习的偏差项。默认值:True
注意:
-
stride 控制卷积操作的步幅,可以是一个单一的数字或一个元组。
-
padding 控制输入的填充量。可以是字符串
{‘valid’, ‘same’}
,或者是一个整数 / 整数组成的元组,表示在两侧应用的隐式填充量。 -
dilation 控制卷积核点之间的间距,也称为
à trous
算法。这个概念较难描述,不过此https://github.com/vdumoulin/conv_arithmetic/blob/master/gif/dilation.gif中有一个关于dilation
的可视化展示。 -
groups 控制输入与输出之间的连接。
in_channels
和out_channels
都必须能被groups
整除。例如:- 当
groups=1
时,所有的输入都会与所有输出进行卷积。 - 当
groups=2
时,操作等价于有两个并行的卷积层,每个卷积层分别处理一半的输入通道,生成一半的输出通道,然后将结果拼接起来。 - 当
groups=in_channels
时,每个输入通道都有自己的一组卷积核(大小为out_channels / in_channels
)。 -
当
groups == in_channels
且out_channels == K * in_channels
,其中K
是一个正整数时,这种操作也被称为“深度卷积(depthwise convolution)”。
- 当
参数 kernel_size
, stride
, padding
, dilation
可以是:
- 单个整数 —— 在这种情况下,高度和宽度维度使用相同的值。
- 两个整数组成的元组 —— 在这种情况下,第一个整数用于高度维度,第二个整数用于宽度维度。
Conv2d 输入输出关系/输出尺寸计算公式:
应用举例
上述示例代码如下:
import torch.nn as nn
import torch
# 创建一个3通道5×5的输入图片tensor
input_image = torch.randn(1, 3, 5, 5) # 输入格式:(batch_size,C,H,W)
print(input_image)
conv = nn.Conv2d(in_channels=3, out_channels=4, kernel_size=3)
output = conv(input_image)
print(output)
结果:
tensor([[[[ 0.0268, -0.5214, -1.0576, -1.8153, 0.4316],[-0.5418, -0.6783, 0.4006, -0.0805, -1.2690],[-0.6283, -2.1069, -0.2319, -0.1486, -0.0421],[ 0.6863, -0.6180, -1.1678, 0.1399, 1.8680],[ 0.2696, -0.4241, 1.2480, -1.1144, -2.1548]],[[-0.9676, -0.7849, -0.6417, 0.6378, -0.0830],[-0.4086, 0.3640, 1.7358, 0.0760, -1.0718],[-1.7090, -0.2209, 1.3072, 0.0145, -1.7926],[ 0.0429, -0.9867, 0.6733, 1.2083, 0.6626],[ 1.0097, -0.4465, -0.6531, -0.7984, -0.7761]],[[-1.0085, 1.6625, 1.2564, 1.5472, 0.8189],[-0.5107, -0.5895, 0.9165, -1.9156, 0.1210],[-1.6979, -0.8243, -0.1660, -0.0143, 0.1751],[ 0.5996, 0.4970, 0.6864, 0.4976, 1.3932],[-0.5763, 1.1135, 0.5067, 0.7716, -0.8962]]]])
tensor([[[[ 0.3662, 0.1012, -0.3846],[ 0.1358, -0.2235, -0.6957],[ 0.1401, -0.6588, -0.5720]],[[ 0.8294, 0.7968, 0.0436],[ 1.3758, -0.2057, -0.0881],[ 0.2979, 0.1449, -0.7776]],[[ 0.3114, 0.0881, -0.0831],[-0.2078, 0.0854, 0.1108],[ 0.5788, 0.0515, 0.0616]],[[ 0.8736, -0.3869, -0.6509],[ 0.4797, 0.0898, -0.1814],[ 0.2414, -0.1471, 0.2750]]]], grad_fn=<ThnnConv2DBackward>)Process finished with exit code 0
我们看到输出的张量形状为1×4×3×3,1表示batch为1,4表示有四个feature_map,3×3表示feature_map的尺寸大小。
其余参数可自行推理!!!