填充与步幅

深入理解卷积神经网络中填充和步幅的作用机制,掌握控制特征图尺寸的关键技巧

发布于 2025-08-08 更新于 2025-08-08635 字 2 分钟
填充与步幅的文章封面
展开文章目录
  1. 1. 填充 (Padding)
  2. 1.1 填充类型
  3. 1.2 代码实现
  4. 2. 步幅 (Stride)
  5. 总结

实践中,习惯使用一致的步幅或填充来控制特征图的尺寸变化。

1. 填充 (Padding)

根据感受野递推公式可知,输入数据经过多个卷积层叠加后,将丢失大量的边界信息。为了使输出特征图的尺寸与输入的保持不变,可在输入数据的边界处填充 (padding) 额外的值以对抗边界信息的丢失。

1.1 填充类型

对于以img尺寸输入、img尺寸输出的卷积层,当卷积核大小为img,步幅为img时,每个边界处的填充量为img。其中:

img

根据卷积操作后,输入输出尺寸的变化,填充的类型可分为:

大多数情况,默认使用0填充边界。亦可使用边界处像素的镜像填充边界。

1.2 代码实现

import torch
import torch.nn as nn

i = torch.randn(1, 1, 13, 13)  # (批量大小, 通道数, 高度, 宽度)
i_size = torch.tensor(i.shape[-2:])

IN_CHANNELS = 1
OUT_CHANNELS = 1
KERNEL_SIZE = 3
STRIDE = 1

padding_vali = 0
padding_same = ((i_size - 1) * STRIDE + KERNEL_SIZE - i_size) // 2
padding_full = ((STRIDE - 1) * i_size + (STRIDE + 1) * KERNEL_SIZE - 2 * STRIDE) // 2

o_vali = nn.Conv2d(IN_CHANNELS, OUT_CHANNELS, KERNEL_SIZE, STRIDE, padding_vali)(i)  # padding='valid'
o_same = nn.Conv2d(IN_CHANNELS, OUT_CHANNELS, KERNEL_SIZE, STRIDE, padding_same)(i)  # padding='same'
o_full = nn.Conv2d(IN_CHANNELS, OUT_CHANNELS, KERNEL_SIZE, STRIDE, padding_full)(i)

print(f'{i.shape = }')
print(f'{o_vali.shape = }')
print(f'{o_same.shape = }')
print(f'{o_full.shape = }')
i.shape = torch.Size([1, 1, 13, 13])
o_vali.shape = torch.Size([1, 1, 11, 11])
o_same.shape = torch.Size([1, 1, 13, 13])
o_full.shape = torch.Size([1, 1, 15, 15])

2. 步幅 (Stride)

步幅 (stride) 是卷积层中的另一个重要参数,决定了卷积核在输入数据从左上角向右下角每次向下、向右滑动经过的像素数量。

不同步幅下的卷积操作示意图


总结

本文介绍了卷积神经网络中两个关键超参数的作用机制:

📐 填充 (Padding)

  • 目的:保持特征图尺寸,防止边界信息丢失
  • 类型:有效填充(缩小)、同维填充(不变)、完全填充(扩大)
  • 应用:通常使用零填充或镜像填充

🏃 步幅 (Stride)

  • 作用:控制卷积核滑动步长,调节输出尺寸
  • 效果:步幅越大,输出越小,计算量越少
  • 优势:降采样、去冗余、提取高层特征

⚙️ 实际应用

填充和步幅是设计CNN架构的重要工具,通过合理搭配可以:

  • 控制网络各层的特征图尺寸变化
  • 平衡计算效率和特征表达能力
  • 适应不同任务的输入输出需求

如果这篇记录对你有帮助,可以留下一句回应。

前往留言

DISCUSSION

讨论与回应

欢迎补充细节、指出问题,或分享与这篇文章有关的经验。

昵称与邮箱为必填项,邮箱仅用于头像和回复通知,不会公开。网址可以留空。

正在准备留言区…

演示赞赏界面

谢谢你愿意支持长期写作。

第一阶段不会发起支付或收集任何信息。接入真实赞赏渠道后,这里会展示清楚的金额、渠道和完成状态。

输入关键词开始搜索 · 按 Esc 关闭
打开完整搜索页 →