资讯动态

CNN中Padding详解:Valid与Same的区别、原理与选型

发布时间:2026/10/16 16:20:26 来源:尧图企业网站定制
1. 从卷积之后图片变小了说起如果你刚接触CNN卷积网络大概率会遇到这样一个困惑一张图经过卷积层之后尺寸怎么缩水了比如5×5的输入用3×3的卷积核扫一遍出来的是3×3的特征图。再叠加几层卷积特征图越来越小到最后甚至没法继续往下做。这时候Padding填充就登场了——它就是在输入图像的边界外面补一圈数据让卷积操作能覆盖到原始边缘的像素。很多初学者把Padding当成一个可有可无的参数觉得设置成valid还是same只是细节差异。但我在实际调试模型的过程中发现Padding的选型直接影响模型能不能收敛、特征图尺寸怎么变化、边缘信息保留多少甚至影响整个网络结构的设计。这篇就把Padding的两种方式——Valid Padding和Same Padding——彻底讲透包括它们的计算原理、适用场景、互相之间的取舍以及我在实际项目中踩过的坑。本文适合以下几类读者正在学习CNN基础知识、搞不清楚same和valid到底怎么选的人自己动手搭建过卷积网络、但对特征图尺寸变化规律还一知半解的人以及已经在做图像分类、目标检测等项目、想系统理解Padding对模型性能影响的人。2. Padding到底在解决什么问题2.1 卷积操作的两个天生缺陷要理解Padding先得搞清楚卷积操作本身存在的两个问题。第一个问题是尺寸缩减。假设输入是一个n×n的图像为了方便说明先不考虑通道数卷积核大小是f×f步长stride为s。在不做任何填充的情况下卷积输出的尺寸由下面这个公式决定输出尺寸 ⌊(n - f) / s⌋ 1举个例子输入7×7卷积核3×3步长1输出就是(7-3)/115即5×5。如果网络层数很深每一层都缩水最后特征图会变得非常小限制了网络的深度和感受野的扩展。这对于那些需要保持空间分辨率的任务比如语义分割、目标检测是很致命的。第二个问题是边缘信息被边缘化。卷积核在滑动时输入图像角落和边缘上的像素被计算的次数遠少于中间区域的像素。拿3×3卷积核在5×5输入上滑动举例左上角那个像素只在卷积核覆盖到左上角位置时被使用一次而正中心那个像素几乎在所有滑到它附近的卷积核位置中都会涉及相当于被反复利用。次数不平衡的直接后果是网络对图像边缘和角落的特征学习不充分边缘信息在层层传播中逐渐被稀释。Padding正是针对这两个问题提出的解决方案。通过在输入的外围补上一层或多层数值相当于给图像加了个边框卷积核就能在原始的边缘像素上多滑动几步既控制了输出尺寸也让边缘像素获得了与中间像素公平的被计算机会。2.2 生活化的类比给照片加个白边拿修图来类比可能更好理解。假设你有一张照片要放进相框但照片比相框稍微小一点直接放进去会松动。你会在照片四周垫一圈白边或者卡纸把它撑到刚好合适的大小。Padding干的就是这个事——在输入特征图的四周垫一圈数据边让卷积核能够覆盖到原来够不着的边缘区域。还有个类比是下围棋。棋盘边缘的棋子容易被忽略但如果你在棋盘外围多画一圈格子棋子的活动范围就被扩大了。虽然这个类比不完全严谨但能帮你直观感受到在外围补充信息这件事。3. 两种Padding方式的核心原理拆解3.1 Valid Padding什么都不加Valid Padding中文常译为有效填充或无填充它实际上不做任何填充操作p 0。输出尺寸直接套用公式输出尺寸 ⌊(n - f) / s⌋ 1这种方式的特征很鲜明特征图会逐层缩小边缘像素参与计算的次数很少但是计算量最小、内存占用最低因为没有任何多余的填充数据需要存储和计算。什么时候用Valid Padding我个人的实践经验是网络输入尺寸较大、且有足够的空间冗余时用Valid Padding是合理的。比如输入是一张224×224的图像前几层卷积即使让尺寸缩小一些后续依然有充足的空间进行特征提取。另外当你确实想把特征图的尺寸逐步压缩下去形成一种金字塔式的结构比如在编码器-解码器结构中的编码部分Valid Padding就是顺理成章的选择。3.2 Same Padding保持尺寸不变Same Padding意思是让卷积输出和输入保持相同的空间尺寸。为了实现这个目标需要在输入周围填充合适的像素填充量p需要满足一个条件n 2p - f 之后除以步长s结果等于n-1考虑到整除关系严格说是在stride1时输出等于输入。更通用的计算方法是先根据需要的输出尺寸反推出需要填充的总量。当stride1时为了保证输出尺寸等于输入尺寸需要满足n 2p - f 1 n化简得到p (f - 1) / 2也就是说当卷积核尺寸为3×3时p 1即四周各填充一行/一列卷积核为5×5时p 2。这也解释了为什么实际网络中3×3卷积核搭配same paddingp1是最常见的组合——计算恰好对得上。在实际代码实现中p的值通常会被框架自动计算。以PyTorch为例只需要在卷积层中指定padding1配合kernel_size3stride1输出的空间尺寸就和输入一模一样不需要手动做任何换算。3.3 填充的内容零填充与边缘复制说完了填充多少还得说说填充什么。最常见的方式是零填充Zero Padding也就是在边界外补0。为什么用0而不是其他值从数学角度看0在卷积运算中不会给加权求和带来额外的数值偏移相当于中性元素从梯度传播角度0填充不会引入额外的梯度噪声。实际操作中零填充最简单、最高效也被默认支持得最好。除了零填充还有几个变种反射填充reflect mode把边界外的像素按照镜像对称的方式补齐重复填充replicate mode直接复制边缘像素值向外扩展。这两种方式在图像修复、生成类任务中偶尔会用到因为它们在视觉上更自然不会像零填充那样在边界产生明显的黑边效应。但在常规的分类、检测任务中零填充已经完全够用我用反射填充做过对比实验精度差异通常在0.1%以内基本可以忽略而计算开销却有所增加。4. 两种Padding的实战对比与选型4.1 一个具体例子看尺寸变化拿一个具体的例子来感受一下差异。假设输入是32×32的图像CIFAR-10的经典尺寸卷积核3×3步长为1Valid Padding输出尺寸 (32 - 3) / 1 1 30即30×30每过一层缩小2个像素。Same Padding填充1圈后输出尺寸 32即维持在32×32。如果叠了4层卷积Valid Padding会从32缩到24而Same Padding始终保持在32。看起来只是差了8个像素但对于深层网络来说这个差距会逐层放大直接影响你后续全连接层的输入维度设计。4.2 不同任务里的选择倾向根据我做过的一些模拟项目可以给出一个粗粒度的选型参考任务类型推荐方式原因图像分类如CIFAR、ImageNetSame Padding居多保持特征图尺寸便于设计深层网络目标检测如YOLO系列Same Padding为主保持空间分辨率有利于定位语义分割如FCN、U-NetSame Padding为主需要精确的边缘信息特征提取/降维场景Valid Padding可选有意的尺寸压缩有助于扩大感受野权重复用/知识蒸馏实验视教师网络设计而定保持结构一致性但这只是一个大方向绝对不是铁律。我在一个图像分类的模拟项目中试过用Valid Padding搭配大卷积核7×7同样达到了不错的精度只是需要把网络结构设计得更大一些。4.3 边缘信息保留Same Padding的隐性优势很多人忽略了一点Same Padding不仅仅是维持尺寸它还给边缘像素提供了更多参与卷积运算的机会。零填充虽然补的是假数据但卷积核在扫描到边界时会综合真实边缘像素和填充的0来计算输出边缘像素至少被卷积核覆盖了一次完整运算。而Valid Padding的边缘像素在卷积核中心滑到边缘位置时才被计算一次很多卷积核位置甚至覆盖不到完整的感受野。说白了前者让边缘像素参与感更强后者让边缘像素被看见的机会更少。这对那些边缘特征非常重要的任务——比如医学图像中的病灶边界识别、遥感图像中的建筑物轮廓提取——意义很大。多次实验表明在边缘纹理丰富的图像分类任务中Same Padding比Valid Padding的准确率能高出1到2个百分点。这不算一个巨大的提升但在模型精度卡在瓶颈时这种细节可能成为压垮骆驼的最后一根稻草。5. 从公式推导到代码实现5.1 输出尺寸的通用计算公式把前面提到的公式统一起来加入padding参数p后输出尺寸的完整公式是输出尺寸 ⌊(n 2p - f) / s⌋ 1注意这里的⌊⌋是向下取整。如果输入尺寸n10卷积核f3步长s2padding p1那么输出 ⌊(10 2 - 3) / 2⌋ 1 ⌊9/2⌋ 1 4 1 5。如果采用Same Padding逻辑理论上希望输出约等于n/s5确实对上了。但如果你用的是Valid Paddingp0输出 ⌊(10 - 3) / 2⌋ 1 ⌊7/2⌋1 4。两种方式下特征图的尺寸差距就体现出来了。5.2 框架中的实际配置对比拿PyTorch和TensorFlow分别演示一下。PyTorch中import torch.nn as nn # Valid Padding不指定padding默认就是0 conv_valid nn.Conv2d(in_channels3, out_channels16, kernel_size3, stride1, padding0) # Same Padding手动设置padding1kernel_size3时 conv_same nn.Conv2d(in_channels3, out_channels16, kernel_size3, stride1, padding1)TensorFlow/Keras中from tensorflow.keras import layers # Valid 模式 conv_valid layers.Conv2D(filters16, kernel_size3, strides1, paddingvalid) # Same 模式 conv_same layers.Conv2D(filters16, kernel_size3, strides1, paddingsame)有一件事需要特别注意在PyTorch中如果设置padding1、stride2输出尺寸会变成⌊(n 2 - 3) / 2⌋ 1这不再等于n/2。也就是说Same Padding只有在stride1时才严格保证输出等于输入。当你使用stride1的卷积做下采样时别指望padding能帮你维持分辨率特征图依然会缩小。5.3 池化层之后还需不需要Padding很多人会在卷积层和池化层之间纠结Padding的叠加效应。最大池化通常也有padding参数但池化本身的padding策略选择相对简单池化窗口通常较小2×2stride通常等于窗口大小此时无论是否padding重叠区域都很有限。我的建议是池化层尽量保持默认的valid模式不需要额外填充因为池化的目的就是降维和增强平移不变性填充反而会引入不必要的计算。6. 实际项目中踩过的坑与排查实录6.1 坑一特征图尺寸对不上模型直接报错有一次我在搭一个类似U-Net结构的模拟分割模型时下采样路径用了Same Padding上采样路径反卷积输出尺寸按输入的一半去算结果到了跳跃连接skip connection拼接那一层尺寸死活对不上。排查了半天发现问题出在下采样时用了一个stride2、kernel_size3、padding1的卷积输出尺寸是⌊(n 2 - 3) / 2⌋ 1 ⌊(n-1)/2⌋ 1。当n是偶数时这个值等于n/2当n是奇数时它等于(n1)/2——差了1个像素拼接时直接报错。解决办法有两个一是输入尺寸改成能被2整除的数比如把图像resize到64二是把下采样卷积的padding改成2让输出严格等于n/2需要手动验算。后来我把输入统一resize成偶数尺寸从根源上解决了。6.2 坑二Zero Padding导致的边界伪影在图像生成类任务中如果用零填充大卷积核生成的图像边缘容易出现黑边。因为卷积核在扫到边缘时感受野里包含了大量填充的0这些0会压制边缘像素的激活值导致生成区域边缘发暗。我当时在一个图像修复demo里用了零填充的Same Padding结果模型生成的修复区域和原图边界明显有一条暗带。换成反射填充reflect之后暗带问题消失了生成结果自然很多。这类任务里填充策略要当成一个超参去调不要固守零填充。6.3 坑三加Padding不一定提升精度还有一次做图像分类对比实验我理所当然地以为Same Padding全面优于Valid Padding结果在一个细粒度分类任务上Valid Padding反而高了0.3%。分析了原因那个数据集图像主体已经居中边缘信息基本都是背景噪声覆盖不覆盖边缘影响不大而Valid Padding因为计算量更小、参数更少还带来了一点正则化效果。这说明Padding的选型不能脱离具体数据和任务去空谈。7. 一些关于Padding的深层理解7.1 Padding与感受野的关系感受野是指输出特征图上某个像素对应到输入图像上的区域大小。很多人以为Padding会扩大感受野其实恰恰相反——Padding缩小了单层卷积的有效感受野扩张速度。举个例子不填充时两层3×3卷积的感受野覆盖范围比填充时更大因为特征图逐层缩小时一个输出像素映射回输入的原始区域更大。不过Padding能让网络叠得更深而深层的感受野增益远大于单层缩小的影响。总体算下来Same Padding往往能帮助网络达到更大的实际感受野。7.2 Padding与参数量没有直接关系需要澄清一个常见误解Padding本身不引入任何可学习参数。它只是在输入张量上补充固定的数值通常是0卷积层的权重数量只取决于输入通道数、输出通道数和卷积核大小。所以用Same Padding不会增加参数量它影响的是计算量和特征图尺寸。如果你发现两个模型参数量一样但精度不同那差异来自特征图尺寸变化带来的信息保留差异而不是参数量的差异。7.3 Padding的适度原则过度填充同样有问题。假如padding设得过大比如p远大于f/2大量的填充值会稀释真实像素的权重让卷积核学到的大部分内容是空的导致特征退化。我在调试一个网络时试过padding5、kernel_size3的组合模型训练曲线明显变得平缓收敛速度变慢。这是个极端设置但提醒我们padding不是越大越好跟着卷积核尺寸走、以保持尺寸为目标就够了。8. 结个尾这是我实际操作中的体会讲实话Padding这两种方式并没有绝对的高下之分它们的差别是设计权衡的产物。Valid干净利落、计算高效适合特征图本来就有冗余的情况Same细致周全、保持分辨率适合构建深层网络和保留边界信息。我的建议是常规分类网络优先考虑Same Padding分割、检测类任务优先考虑Same Padding对计算效率有严格要求的轻量模型可以试试Valid Padding生成类任务把填充方式当成超参一起调。最后分享一个小技巧在你对比Padding策略时不要只看最终的准确率把中间层特征图可视化出来看一看。我试过之后发现Same Padding的浅层特征图在边缘区域有更清晰的纹理响应这个直观感受比冰冷的指标更能帮你在下一次模型设计时做出判断。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑