动手学深度学习——填充和步幅详解:卷积输出尺寸到底怎么控制?

张开发
2026/4/18 18:28:36 15 分钟阅读

分享文章

动手学深度学习——填充和步幅详解:卷积输出尺寸到底怎么控制?
一、前言在前面的“图像卷积”和“卷积层”中我们已经知道了卷积最基本的计算过程卷积核在输入上滑动每次看一个局部区域做逐元素相乘再求和最终得到输出特征图同时我们也发现了一个很明显的现象卷积之后输出尺寸通常会变小。这意味着如果卷积核比较大输出会缩得很快如果堆很多层卷积特征图可能很快就变得很小边缘位置的信息也更容易被不断“吃掉”这时候就会自然出现两个问题1. 能不能让卷积后输出别缩得那么快这就需要填充padding。2. 能不能让卷积核每次走得更快一点这就需要步幅stride。所以这一节“填充和步幅”的核心就是控制卷积输出尺寸以及控制卷积核在输入上的移动方式。这一节非常重要因为后面几乎所有 CNN 结构都离不开它。二、为什么卷积后尺寸会不断变小我们先回顾最基础的情况。这说明如果没有额外处理卷积会非常快地压缩空间尺寸。这在某些情况下是有用的但很多时候我们并不希望缩得这么快。三、什么是填充Padding所谓填充就是在输入图像的边缘补上一圈额外的值通常补 0。所以你可以把填充理解成在卷积之前先给输入边界“加外框”。这样做之后卷积核在边缘就有更多可滑动的位置输出尺寸就不会缩得那么快。四、为什么需要填充填充最主要有两个作用。1. 控制输出尺寸这是最直接的作用。如果不填充卷积一次就会让尺寸变小如果适当填充就可以保持输出尺寸不变或者让尺寸减小得更慢这在深层网络里非常重要。2. 更公平地利用边缘信息如果不填充图像边缘像素参与卷积的次数会比中间像素少很多。例如中间区域可以被卷积核覆盖很多次但边缘和角落位置因为靠近边界能参与计算的机会少。这意味着不填充时模型天然更“重视中间、忽视边缘”。而加了填充之后边缘区域也能更多次参与卷积计算信息利用更均衡。五、最常见的填充值为什么是 0在 CNN 中最常见的是零填充zero padding也就是在边界补 0。为什么常用 01. 简单直接实现最方便也最容易统一处理。2. 不引入额外强信息补 0 相当于“这里没有额外内容”不会人为制造太强的边界模式。3. 在实践中效果通常足够好所以大家用得最多。当然理论上也可以补常数边缘复制值镜像值但在深度学习基础阶段你先把零填充理解透就足够了。六、一个最直观的例子为什么 padding 能保尺寸这就是最经典的“保持尺寸不变”的 padding 设置。七、一般的输出尺寸公式带 padding八、什么时候能让输出尺寸不变这是特别重要的一点也是最常考、最常用的结论。例如1. 3×3 卷积核每边填充 12. 5×5 卷积核每边填充 23. 7×7 卷积核每边填充 3这就是为什么在 CNN 中3×3 卷积常配 padding15×5 卷积常配 padding2因为这样最方便保持尺寸。九、为什么卷积核通常喜欢用奇数尺寸你会发现在实际 CNN 中卷积核经常是3×35×57×7而不是 2×2、4×4。原因之一就是奇数尺寸更容易设置对称中心。例如 3×3 核有一个很清晰的中心点padding 后也容易保持输入输出对齐。如果是 2×2 核就没有一个特别明确的中心设计起来不如奇数卷积核自然。所以在实践中奇数卷积核更常见。十、什么是步幅Stride如果说 padding 解决的是“边界和尺寸缩小太快”的问题那么 stride 解决的则是卷积核每次移动多远。前面默认情况下我们都认为卷积核是一次移动 1 格。这其实就是[stride 1]如果设置[stride 2]就表示卷积核每次不再走 1 格而是跨 2 格再计算下一次。所以 stride 可以理解成卷积核滑动时的步子大小。十一、为什么需要 stride步幅最主要的作用是1. 控制输出尺寸缩小速度步幅越大输出尺寸越小得快。2. 降低计算量因为卷积核停留的位置变少了计算次数也就少了。3. 实现下采样stride 1 时卷积层本身就带有“压缩空间分辨率”的效果。所以 stride 本质上是在做一种带参数的下采样。这和后面的池化层有些相似但它是通过卷积来完成的。十二、一个直观例子理解 stride假设输入是[5 \times 5]卷积核是[3 \times 3]情况一stride 1卷积核可以滑动的位置是横向 3 个纵向 3 个所以输出是[3 \times 3]情况二stride 2卷积核每次跨 2 格移动位置就少了很多。输出大小会变成[2 \times 2]这说明步幅变大后输出尺寸缩小得更快。十三、一般的输出尺寸公式带 stride如果输入大小为十四、为什么公式里会有“向下取整”因为卷积核滑动时必须完整落入输入范围内。如果最后剩下一点点位置不够卷积核完整放下那就不能算一个新的输出位置。所以公式里要向下取整。这也意味着有时候步幅和尺寸不整除时最后一部分输入可能不会被完全利用。十五、padding 和 stride 经常一起考虑在实际 CNN 设计中padding 和 stride 几乎总是一起出现的因为它们共同决定输出尺寸特征图缩小速度信息保留程度计算量大小你可以这样理解padding决定边界怎么处理、是否保尺寸stride决定卷积核走得快不快、输出缩得快不快所以卷积层的空间行为本质上就是由这两个量一起控制的。十六、PyTorch 中怎么设置 padding 和 stride在 PyTorch 中二维卷积层这样写from torch import nn conv2d nn.Conv2d( in_channels1, out_channels1, kernel_size3, padding1, stride1 )这里kernel_size33×3 卷积核padding1四周各补 1 圈 0stride1每次移动 1 格如果想让卷积下采样更快可以写conv2d nn.Conv2d(1, 1, kernel_size3, padding1, stride2)这就表示保留边界信息但每次跨 2 格移动输出尺寸会缩小十七、一个适合 的代码示例基础代码import torch from torch import nn # 输入形状(batch_size, channels, height, width) X torch.rand(1, 1, 8, 8) # 1. 3x3卷积padding1stride1 conv1 nn.Conv2d(1, 1, kernel_size3, padding1, stride1) Y1 conv1(X) print(Y1 shape:, Y1.shape) # 仍然是 8x8 # 2. 3x3卷积padding1stride2 conv2 nn.Conv2d(1, 1, kernel_size3, padding1, stride2) Y2 conv2(X) print(Y2 shape:, Y2.shape) # 会缩小 # 3. 5x5卷积padding2stride1 conv3 nn.Conv2d(1, 1, kernel_size5, padding2, stride1) Y3 conv3(X) print(Y3 shape:, Y3.shape) # 仍然是 8x8通过这段代码你可以很清楚看到padding控制是否保尺寸stride控制输出缩小速度十八、为什么说 padding1 对 3×3 卷积特别常见十九、stride2 为什么经常用来下采样因为 stride2 很自然地让输出空间尺寸大约减半。例如输入 8×83×3 卷积padding1stride2输出会变成大约 4×4。这样做的好处是特征图更小计算量下降感受野增长更快所以在现代 CNN 中stride2 常常被用来替代部分池化操作或者作为下采样手段。二十、padding 和 stride 的直观类比如果你想更形象一点理解可以这样类比padding 像什么像给图像四周加了一圈“缓冲边框”。stride 像什么像卷积核走路时迈多大的步子。于是padding 决定边上有没有空间让你多站几次stride 决定你下一步跨多远这个类比其实挺直观的。二十一、这一节最容易混淆的几个点1. padding 不是缩小尺寸而是帮助控制尺寸它通常让输出不要缩得太快甚至可以保持不变。2. stride 不是卷积核大小stride 是卷积核每次滑动的距离。3. 卷积核大小和 stride 是两个完全不同的概念kernel_size窗口多大stride窗口走多远4. padding1 不是永远保尺寸只有在卷积核大小合适时比如 3×3padding1 才正好保尺寸。5. stride 大了输出会更小因为卷积核停留的位置更少了。二十二、这一节的核心思想如果让我用一句话总结“填充和步幅”这一节我会写成padding 用来控制边界和输出尺寸stride 用来控制卷积核移动速度和下采样强度。这句话你可以直接记住。因为它把这一节最关键的两个角色分工说得非常清楚padding补边界保信息控尺寸stride跨步走降分辨率减计算二十三、我对这一节的理解学这一节之前我对 padding 和 stride 的感觉比较像“卷积里的附加参数”好像只是 API 里顺手一填的东西。但真正理解之后我才发现它们不是边角料而是卷积层空间行为的核心控制器。同样一个卷积核如果padding 不同stride 不同那么输出尺寸、信息保留方式、特征图变化速度都会完全不一样。也就是说卷积层不是只有“卷积核内容”重要卷积核怎么走、边界怎么补同样非常关键。二十四、结语“填充和步幅”是学习卷积神经网络时非常重要的一节。因为从这一节开始我们不再只是会“算卷积”而是开始能真正控制卷积层的输出尺寸和空间行为。通过这一节我们应该真正弄清楚为什么卷积会让输出变小padding 为什么能保尺寸stride 为什么能实现下采样输出尺寸公式应该怎么理解为什么 3×3 卷积经常配 padding1把这些基础打牢后面再学习多输入输出通道、池化层、LeNet就会轻松很多。二十五、重点速记版1. 什么是 padding在输入边缘补值通常补 0。2. padding 的主要作用是什么控制输出尺寸、保护边缘信息。3. 什么是 stride卷积核每次滑动的步长。4. stride 的主要作用是什么控制输出尺寸缩小速度和下采样强度。5. 3×3 卷积想保尺寸padding 应该设多少padding 16. 为什么 stride2 常用于下采样因为它会让输出空间尺寸大约减半。以上就是我对《动手学深度学习》中填充和步幅这一节的学习整理。这一节虽然不像“卷积层”那样听起来很核心但实际上它对卷积网络的结构设计影响非常大。因为卷积核不只是“算什么”重要“怎么走”和“边界怎么处理”同样非常重要。我觉得这一节最值得记住的一点就是padding 和 stride 不是附属参数而是卷积层空间尺寸控制的关键。把这一点想清楚后面学池化层、多通道卷积和经典 CNN 结构时会顺很多。

更多文章