PyTorch卷积层填充(Padding)与步幅(Stride)详解及代码示例
本文通过具体代码示例讲解PyTorch中卷积操作的填充(Padding)和步幅(Stride)对输出形状的影响,帮助读者掌握卷积层的参数配置技巧。
一、填充与步幅基础
-
填充(Padding):在输入数据边缘添加指定数量的像素,用于控制输出尺寸的大小。
-
步幅(Stride):卷积核在输入数据上每次滑动的步长,用于控制输出尺寸的缩小比例。
输出尺寸计算公式:
二、代码实现与示例
1. 全侧边填充1个像素
import torch
from torch import nndef comp_conv2d(conv2d, x):x = x.reshape((1, 1) + x.shape) # 增加批次和通道维度y = conv2d(x) # 计算卷积return y.reshape(y.shape[2:]) # 删除批次和通道维度# 创建卷积层:3x3卷积核,填充1像素
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1)
x = torch.rand((8, 8)) # 8x8输入矩阵
comp_conv2d(conv2d, x).shape # 输出形状
输出结果:
torch.Size([8, 8])
解析:填充1像素后,输入尺寸保持不变。
2. 非对称填充(高度和宽度不同)
# 创建卷积层:5x3卷积核,高度填充2,宽度填充1
conv2d = nn.Conv2d(1, 1, kernel_size=(5, 3), padding=(2, 1))
comp_conv2d(conv2d, x).shape
输出结果:
torch.Size([8, 8])
3. 步幅设置为2
# 创建卷积层:3x3卷积核,填充1,步幅2
conv2d = nn.Conv2d(1, 1, kernel_size=3, padding=1, stride=2)
comp_conv2d(conv2d, x).shape
输出结果:
torch.Size([4, 4])
4. 复杂参数组合
# 创建卷积层:3x5卷积核,高度不填充,宽度填充1,步幅(3,4)
conv2d = nn.Conv2d(1, 1, kernel_size=(3, 5), padding=(0, 1), stride=(3, 4))
comp_conv2d(conv2d, x).shape
输出结果:
torch.Size([2, 2])
三、总结
-
填充用于保持输入输出尺寸一致或调整边缘特征保留。
-
步幅用于降低输出尺寸,减少计算量。
-
通过组合不同参数,可灵活控制卷积层的输出形状。
建议读者通过修改参数自行实验,深入理解公式中的数值变化规律。