卷积层输出形状的通用公式
在卷积神经网络中,输出形状的公式并非凭空而来,而是通过卷积操作的基本原理逐步推导得出的。
一、卷积输出形状的通用公式
对于 3D 卷积,输出形状的每个维度(时间 \(T\)、高度 \(H\)、宽度 \(W\))计算公式为:
\[\text{Output} = \left\lfloor \frac{\text{Input} + 2 \times \text{padding} - \text{kernel_size}}{\text{stride}} + 1 \right\rfloor
\]
其中:
- \(\text{Input}\): 输入尺寸(时间、高度或宽度)
- \(\text{padding}\): 该维度上的填充值
- \(\text{kernel_size}\): 卷积核在该维度的尺寸
- \(\text{stride}\): 步幅
- \(\lfloor \cdot \rfloor\): 向下取整(当无法整除时,舍弃余数)
二、举个例子
参数说明:
nn.Conv3d(
in_channels=2,
out_channels=64,
kernel_size=(5,7,7),
stride=(2,4,4),
padding=(2,3,3)
)
- 输入形状:假设为视频光流数据,形状为 \((N, 2, T, H, W)\),例如 \((N, 2, 16, 256, 256)\)。
- 各维度参数:
- 时间维度(第一维):
kernel_size=5,stride=2,padding=2 - 空间维度(高度和宽度):
kernel_size=7,stride=4,padding=3
- 时间维度(第一维):
分维度推导:
-
时间维度(\(T\)):
\[T_{\text{out}} = \left\lfloor \frac{16 + 2 \times 2 - 5}{2} + 1 \right\rfloor = \left\lfloor \frac{16 +4 -5}{2} +1 \right\rfloor = \left\lfloor \frac{15}{2} +1 \right\rfloor = \left\lfloor 7.5 +1 \right\rfloor = 8 \] -
高度(\(H\)):
\[H_{\text{out}} = \left\lfloor \frac{256 + 2 \times 3 -7}{4} +1 \right\rfloor = \left\lfloor \frac{256 +6 -7}{4} +1 \right\rfloor = \left\lfloor \frac{255}{4} +1 \right\rfloor = \left\lfloor 63.75 +1 \right\rfloor = 64 \] -
宽度(\(W\)):计算方式与高度相同,结果也是 \(64\)。
最终输出形状:
\[(N, 64, 8, 64, 64)
\]
验证:输入 \((N, 2, 16, 256, 256)\) → 输出 \((N, 64, 8, 64, 64)\),与实际代码一致。
三、公式的直观理解
-
填充(Padding)的作用:
在输入周围添加零值,扩大可卷积区域。例如时间维度填充 2,意味着在时间序列前后各补 2 帧(共扩展 \(2+2=4\) 帧),使得卷积核能完整覆盖输入的时间范围。 -
步幅(Stride)的影响:
控制卷积核滑动的间隔。例如时间维度步幅为 2,意味着每次滑动跳过 1 帧(实际移动步长为 2),直接减少输出长度。 -
向下取整的必要性:
当剩余空间不足以滑动卷积核时,舍弃边缘部分。例如若计算得到 \(7.5\),实际有效卷积操作只能执行 7 次,余下部分被忽略。
四、常见问题解答
1. 为什么不同框架(PyTorch/TensorFlow)的公式略有差异?
- PyTorch:严格遵循上述公式,直接截断余数。
- TensorFlow:部分模式(如
"SAME")会自动调整填充,确保输出尺寸为输入除以步幅的向上取整。需注意框架差异。
2. 如何避免输出尺寸过小或负数?
- 约束条件:需满足 $ \text{Input} + 2 \times \text{padding} \geq \text{kernel_size} $。
- 示例:若输入时间维度为 3,而
kernel_size=5且padding=0,则 \(3 +0 -5 =-2\),计算会得到负数,导致错误。
3. 公式是否适用于所有维度?
- 是!无论是时间、高度还是宽度,均按维度独立计算。例如以下卷积层:
nn.Conv3d(64, 128, kernel_size=(3,5,5), stride=(1,2,2), padding=(1,2,2))- 时间维度:\(T_{\text{out}} = \left\lfloor \frac{8 +2\times1 -3}{1} +1 \right\rfloor =8\)(保持不变)
- 空间维度:\(H_{\text{out}} = \left\lfloor \frac{64 +2\times2 -5}{2} +1 \right\rfloor =32\)
五、总结
- 公式是推导而来:基于卷积核滑动和填充规则,通过数学归纳得出。
- 实际应用:只需代入参数计算,但需注意约束条件(如输入尺寸 ≥ 卷积核尺寸)。
- 设计建议:在构建网络时,可使用工具(如 PyTorch 的
torchsummary)直接打印各层输出形状,避免手动计算错误。
通过理解这些公式,你可以更灵活地设计卷积层的参数,精准控制特征图的空间-时间分辨率。

浙公网安备 33010602011771号