1. 深度学习中的卷积操作基础
作为一名刚接触深度学习的初学者,我最初对卷积神经网络(CNN)中的填充(padding)和步幅(stride)概念感到非常困惑。直到在实际项目中遇到图像尺寸不断缩小的问题,才真正理解它们的重要性。让我们从一个具体例子开始:假设我们有一张240×240像素的输入图像,经过10层5×5卷积后,输出会缩小到200×200像素——这意味着我们丢失了大量边缘信息。
卷积操作的本质是通过滑动窗口(卷积核)在输入数据上提取特征。但这里存在两个关键问题:
- 每次卷积后特征图尺寸会缩小
- 边缘像素的利用率远低于中心像素
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 填充(padding)的详细解析
2.1 为什么需要填充
当使用3×3卷积核时,每次卷积会使特征图长宽各减少2像素。对于多层CNN,这种尺寸缩减会累积,最终可能导致特征图变得过小。填充就是在输入数据的边缘添加额外的"虚拟像素"(通常为0),以保持输出尺寸。
数学表达式:
- 无填充时输出尺寸:(n_h - k_h + 1) × (n_w - k_w + 1)
- 有填充时输出尺寸:(n_h - k_h + p_h + 1) × (n_w - k_w + p_w + 1)
其中n是输入尺寸,k是卷积核尺寸,p是填充量。
2.2 填充的常见策略
最常用的两种填充方式:
- Valid卷积(无填充):p=0
- Same卷积(完全填充):p=(k-1)/2,保持输入输出尺寸相同
实际代码示例(PyTorch):
python复制# Same填充的3×3卷积
conv_same = nn.Conv2d(in_channels=1, out_channels=1, kernel_size=3, padding=1)
# Valid填充的3×3卷积
conv_valid = nn.Conv2d(1, 1, kernel_size=3, padding=0)
2.3 填充的视觉化理解
想象在一张照片周围加上相框:
- 黑色相框(零填充):最常用,不影响原始内容
- 镜像填充:复制边缘像素,适合图像处理
- 重复填充:延续最后一个像素值
3. 步幅(stride)的深入探讨
3.1 步幅的基本概念
步幅控制卷积核滑动的步长。默认stride
