PyTorch中Conv2D层padding参数运行结果与预期不符问题求解
PyTorch Conv2D计算结果不符合预期的原因
1. 输出尺寸和预期不符的原因
PyTorch中Conv2D层的输出尺寸有明确的官方计算规则,对于输入高度H_in,输出高度H_out的计算公式为:
H_out = floor((H_in + 2*padding - dilation*(kernel_size - 1) - 1) / stride + 1)
默认情况下卷积的扩张系数dilation=1,代入你给出的参数:
H_in = 6,padding=2,kernel_size=5,stride=2
计算过程如下:
H_out = floor((6 + 2*2 - 1*(5-1) -1)/2 + 1) = floor(5/2) +1 = 2 +1 =3
宽度计算规则和高度完全一致,所以最终输出特征图尺寸为3*3,和你运行代码得到的结果一致,你之前的尺寸计算逻辑存在错误。
2. 输出没有零值的原因
你这里存在两处认知偏差:
- 你贴出的
y[0][0]结果尺寸为6*6,明显和y.shape的[1,1,3,3]冲突,属于打印错误,大概率是你误把输入张量x的打印结果当成了输出y的结果。 - 零填充是作用在输入张量上的,并不会直接出现在输出结果里:卷积的输出是感受野内的所有元素(包括填充的零)和卷积核权重逐元素相乘累加后,再加上偏置的结果。Conv2D层默认会随机初始化卷积核权重和偏置,就算有填充的零参与计算,最终的累加+偏置结果几乎不可能刚好为零,所以输出里不会出现你预期的零值。
你如果想验证填充逻辑,可以手动把卷积核权重设为全1、关闭偏置,再运行代码,就能通过输出结果反推填充逻辑,示例代码如下:
import torch from torch import nn x = torch.ones(1,1,6,6) conv = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=5, stride=2, padding=2, bias=False) # 手动把卷积核设为全1 nn.init.constant_(conv.weight, 1) y = conv(x) print(y.shape) print(y[0][0])
此时输出的每个值就是对应感受野内的元素总和,你可以自行计算验证填充逻辑。
内容的提问来源于stack exchange,提问作者danix
相关产品推荐
相关产品推荐

