Python3.8+PyTorch1.7.1中Conv2d输出空间维度计算结果与实际不符的疑问
为什么你的卷积输出维度计算和PyTorch实际结果不一致?
你遇到的问题核心在于PyTorch对卷积输出空间维度的计算采用了地板除法(整数除法,舍去小数部分),而不是你使用的普通浮点数除法。
先明确你的参数:
- 输入空间维度
W=6 - 卷积核尺寸
K=3 - 步长
S=2 - 填充
P=1
你用的公式是通用的理论公式:
O = ((W - K + 2P)/S) + 1
代入后得到 (6-3+2*1)/2 +1 = 5/2 +1 = 3.5,但PyTorch实际输出是3。这是因为PyTorch的实际计算逻辑是:
O = floor((W - K + 2P)/S) + 1
代入数值计算:floor((6-3+2*1)/2) +1 = floor(5/2)+1 = 2+1=3,正好和你看到的torch.Size([4,6,3,3])结果一致。
为什么PyTorch要这么做?
卷积操作中,当输入经过填充后的尺寸减去卷积核尺寸后,剩余的长度不足以完成一次完整的步长移动时,PyTorch默认会丢弃这些无法覆盖完整卷积核的边缘部分,而不是额外填充或者调整步长。这是卷积层的默认行为(除非你显式设置了padding_mode='same'或者使用其他特殊参数)。
手动模拟验证
我们可以手动模拟这个卷积过程:
- 原输入是6x6,加上padding=1后,输入的有效尺寸变为8x8(每个维度上下左右各加1个0)。
- 卷积核是3x3,步长为2:
- 行方向上,卷积核的起始位置可以是0、2、4(下一个位置6的话,6+3=9超过8,所以停止),共3个位置。
- 列方向同理,也是3个位置。
- 最终输出的空间维度就是3x3,和PyTorch的输出完全匹配。
补充说明
如果你的输入尺寸变化,比如输入是7x7,同样的卷积参数,按照PyTorch的逻辑计算:floor((7-3+2*1)/2)+1 = floor(6/2)+1=3+1=4,输出会是4x4,这也符合实际卷积的覆盖范围。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

