You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'或者使用其他特殊参数)。

手动模拟验证

我们可以手动模拟这个卷积过程:

  1. 原输入是6x6,加上padding=1后,输入的有效尺寸变为8x8(每个维度上下左右各加1个0)。
  2. 卷积核是3x3,步长为2:
    • 行方向上,卷积核的起始位置可以是0、2、4(下一个位置6的话,6+3=9超过8,所以停止),共3个位置。
    • 列方向同理,也是3个位置。
  3. 最终输出的空间维度就是3x3,和PyTorch的输出完全匹配。

补充说明

如果你的输入尺寸变化,比如输入是7x7,同样的卷积参数,按照PyTorch的逻辑计算:
floor((7-3+2*1)/2)+1 = floor(6/2)+1=3+1=4,输出会是4x4,这也符合实际卷积的覆盖范围。

内容的提问来源于stack exchange,提问作者Arun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 06:29:06