CNN 中 Padding 和 Stride 如何影响输出尺寸?
简化版
Padding 决定卷积在边界外补什么以及输出是否缩小,Stride 决定卷积核每次移动多少并控制下采样。输出尺寸按向下取整公式计算;same 只表示目标输出尺度,不保证不同框架在偶数核或 stride>1 时采用相同左右填充。
详细版
-
单维输出为
floor((I+P_left+P_right-D(K-1)-1)/S)+1。 -
zero padding 会给边缘引入人为的零上下文,reflect/replicate/circular 代表不同边界假设。
-
stride=2 通常把高宽约减半、空间计算约减至四分之一。
-
下采样前未低通会产生混叠,一像素平移也可能引发明显输出变化。
-
多分支网络做残差相加或特征拼接时,尺寸必须逐层精确核对。
完整版教学
一、卷积输出几何由覆盖窗口决定
卷积核只有完全或部分落在补齐后的输入范围内时才产生输出。
Padding 扩展可访问范围,Stride 则跳过部分起点,二者共同决定输出网格。
工程中尺寸差一格往往来自 floor、奇偶核或非对称 padding。
只背“same 不变、valid 变小”不足以处理一般情况。
二、底层机制与关键公式
有效核尺寸是 D(K-1)+1。
可用起点数量理解公式:补齐后长度减去有效核,再除以步幅,向下取整后加一。
当目标是 ceil(I/S) 的 same 输出时,总 padding 可能是奇数,必须一侧多补一个。
TensorFlow 与 PyTorch 的自动 padding 接口和分配规则需要查清,移植模型时尤其关键。
O = floor((I + P_left + P_right - D*(K-1) - 1) / S) + 1
K_effective = D*(K-1)+1
三、带数字的推演
I=7、K=3、S=2、D=1、P_left=P_right=1,输出为 floor((7+2-2-1)/2)+1=4。
若不 padding,则为 floor((7-3)/2)+1=3。
四、方案对比与选择
| 方案/场景 | 机制或优势 | 主要代价 |
|---|---|---|
| valid | 不补边界 | 输出缩小,边缘参与次数少 |
| same, S=1 | 常保持输入尺寸 | 可能引入边界伪影 |
| stride=2 | 约减半高宽 | 省计算但可能混叠 |
五、实际执行流程
输入长度 I -> 两侧 padding -> 得到 I+Pl+Pr
-> 放置有效核 Keff -> 每次移动 S -> 统计合法起点 -> 输出 O
六、边界条件与工程代价
非对称 padding 会造成特征坐标中心偏移。
检测和分割若多次上下采样再融合,一像素偏移可能表现为边界错位,因此要记录每层坐标变换。
stride 并不是免费的池化替代。
若输入含超过新 Nyquist 频率的纹理,直接抽样会混叠;blur pooling 等方法先低通再降采样可提高平移稳定性。
记忆钩子:先算有效核
D(K-1)+1,再按“补后长度—有效核,除 stride,floor 后加一”求输出。
七、常见误区与追问
-
误区:same padding 永远是四边各补 K//2。 stride>1、偶数核或 dilation 下可能需要非对称计算。
-
追问:公式为什么要 floor? 最后一个无法完整覆盖有效输入的位置不能产生输出。
-
误区:Padding 只影响尺寸。 补充值改变边缘像素看到的上下文,也会影响预测。
-
追问:stride=2 的计算为何约降到四分之一? 高和宽都约减半,输出位置数约为原来的 1/4。
-
追问:如何检查残差分支尺寸? 分别计算主支和捷径的 H、W、C,必要时用投影卷积对齐。
八、加强记忆
先算有效核 D(K-1)+1,再按“补后长度—有效核,除 stride,floor 后加一”求输出。
Padding 管边界假设,Stride 管采样密度;尺寸之外还要回答坐标偏移和混叠。