第09讲 | CNN基础:局部感受野、卷积核、Padding与Stride
购买相关资料后畅享一对一答疑!
畅享超多免费持续更新且可大幅度提升文章档次的纯干货工具!
素材来源:B站视频《第09讲〈CNN基础:局部感受野、卷积核、Padding与Stride〉》,UP主:Ai学术叫叫兽。本文为学习笔记式原创整理,适合科研小白按步骤复习和实操。
人看一张图,不会把所有像素当成一根超长电话线,从头读到尾。
你看一只猫,通常先看到耳朵边缘,再看到眼睛附近的纹理,最后才拼成整张脸。
CNN 的核心思想,就是先看局部,再逐步组合成整体。
这一讲只抓 4 个关键点:
- 为什么图像不适合直接用全连接硬怼。
- 局部感受野和卷积核到底是什么关系。
- Padding 为什么能保住边缘信息。
- Stride 为什么会影响速度和分辨率。
一、先看大图:CNN 在做什么?
| 方式 | 输入方式 | 问题 |
|---|---|---|
| 全连接网络 | 先把图像展平 | 参数爆炸,空间结构丢失 |
| CNN | 用小窗口扫描局部区域 | 更适合图像、边缘、纹理和局部模式 |
图 1:全连接和卷积的差别
全连接:整张图拉平 -> 直接学习 问题:像素顺序被打散,参数特别多 卷积:小窗口滑动 -> 局部提特征 -> 再往后组合 优势:保留空间结构,共享参数你可以把 CNN 理解成一个“局部特征提取器”:
边缘 -> 纹理 -> 局部部件 -> 更复杂的目标这也是为什么后面学 YOLO 时,Backbone 不是乱堆模块,而是在一步一步提取更有用的视觉特征。
二、局部感受野:神经元只看一小块
局部感受野,指的是一个神经元只连接输入图像的一部分区域,而不是整张图。
如果输入是5x5的小图,卷积核是3x3,那么每次只看3x3的局部块:
输入图像 ┌─────┐ │局部块│ -> 卷积核只处理这一小块 └─────┘这样做有 3 个好处:
| 好处 | 说明 |
|---|---|
| 更符合图像结构 | 图像里的边缘、角点、纹理本来就是局部的 |
| 参数更少 | 不需要每个输出神经元连整张图 |
| 可迁移性更强 | 同一个卷积核能在不同位置重复使用 |
三、卷积核:真正干活的小窗口
卷积核就是在图像上滑动的“小窗口”,也叫 filter。
它本质上做两件事:
- 在一个局部区域里做加权求和。
- 把这个结果写到输出特征图的一个位置上。
简化公式:
输出 = 输入局部块 × 卷积核权重 + 偏置更完整一点:
y(i, j) = Σ x(i+u, j+v) · w(u, v) + b这里最关键的是权重共享:
- 同一个卷积核参数,会在整张图上重复使用。
- 这让 CNN 比全连接网络省很多参数。
- 也让“同一种边缘”能在不同位置被检测出来。
一个直观例子
假设你用一个3x3卷积核去扫图像:
| 过程 | 含义 |
|---|---|
| 取局部块 | 只看当前3x3区域 |
| 乘以权重 | 判断这块像不像边缘、纹理或局部形状 |
| 滑动到下一格 | 继续在别的位置重复同样操作 |
这就是卷积“会找模式”的原因。
四、Padding:给图像加一圈安全边
不加 Padding 时,卷积到边缘会越来越小。
比如输入5x5,卷积核3x3,stride=1,padding=0:
输出尺寸 = 3x3边缘信息会被快速压缩掉。
Padding 的作用就是在图像四周补零,让卷积核也能照顾到边缘。
常见 Padding 方式
| 设置 | 作用 |
|---|---|
padding=0 | 不补边,输出更小 |
padding=1 | 3x3 卷积常用,尺寸更容易保持不变 |
same | 尽量保持输入输出尺寸一致 |
最常见的记法
当kernel_size=3且stride=1时:
padding=1 -> 输入输出尺寸基本不变这在 CNN 里非常常见,因为它能让你“多看几层”,同时不让特征图缩得太快。
五、Stride:卷积窗口每次走多远
Stride 就是卷积核每次滑动的步长。
| Stride | 结果 |
|---|---|
stride=1 | 看得细,输出更大 |
stride=2 | 跳着看,输出减半左右 |
stride>2 | 压缩更狠,信息损失更大但更快 |
你可以把它理解成:
Stride 小 -> 看得细 Stride 大 -> 看得快典型取舍
| 需求 | 建议 |
|---|---|
| 想保留更多细节 | 用小 stride |
| 想降低分辨率、加快计算 | 用大 stride |
| 想做下采样 | stride=2很常见 |
六、输出尺寸怎么计算?
当 dilation=1 时,卷积输出尺寸公式是:
H_out = floor((H_in + 2P - K) / S) + 1 W_out = floor((W_in + 2P - K) / S) + 1其中:
| 符号 | 含义 |
|---|---|
H_in, W_in | 输入高和宽 |
P | padding |
K | kernel_size |
S | stride |
直接拿例子算
| 输入 | 卷积核 | Padding | Stride | 输出 |
|---|---|---|---|---|
5x5 | 3x3 | 0 | 1 | 3x3 |
5x5 | 3x3 | 1 | 1 | 5x5 |
5x5 | 3x3 | 1 | 2 | 3x3 |
32x32 | 3x3 | 1 | 2 | 16x16 |
这张表是你调 CNN 时最该背熟的东西之一。
七、科研小白实操:跑一遍形状变化
先别上来就堆很多层。先看懂一层卷积到底把 shape 改成什么。
importtorchfromtorchimportnn x=torch.randn(2,3,32,32)# [B, C, H, W]stem=nn.Sequential(nn.Conv2d(3,8,kernel_size=3,stride=1,padding=1),nn.ReLU(),nn.Conv2d(8,16,kernel_size=3,stride=2,padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2,stride=2))y=stem(x)print("input :",x.shape)print("output:",y.shape)这段代码会发生什么?
| 层 | 参数 | 输出 shape |
|---|---|---|
| 输入 | 3x32x32 | 2, 3, 32, 32 |
| Conv1 | 3 -> 8, k=3, s=1, p=1 | 2, 8, 32, 32 |
| Conv2 | 8 -> 16, k=3, s=2, p=1 | 2, 16, 16, 16 |
| MaxPool | k=2, s=2 | 2, 16, 8, 8 |
你要养成的习惯
- 每写一层,就打印一次 shape。
- 先确认通道数对不对。
- 再确认高宽有没有按预期变化。
这比盲目堆网络有效得多。
八、常见错误排查表
| 问题 | 常见原因 | 怎么改 |
|---|---|---|
| 输出 shape 不对 | padding 或 stride 算错 | 先手算,再打印 shape |
| 通道报错 | in_channels和前一层输出不一致 | 检查Conv2d(in_channels, out_channels) |
| 图像被压得太小 | stride 太大,层数太多 | 降低 stride,减少下采样 |
| 边缘信息丢失 | 没有 padding | 给 3x3 卷积常配padding=1 |
| 训练速度太慢 | 输入太大、下采样太晚 | 早点做下采样 |
九、今天的学习任务
如果你是科研小白,今天就做这 4 件事:
- 找一张
32x32或64x64的图片,手算一次卷积输出尺寸。 - 用
nn.Conv2d试padding=0/1和stride=1/2。 - 每改一次参数,就打印一次
tensor.shape。 - 记住一句话:卷积看局部,padding 保边界,stride 控分辨率。
十、三句话复盘
- 局部感受野让神经元只看图像的一小块,更符合视觉结构。
- 卷积核通过权重共享,在整张图上重复找模式。
- Padding 和 Stride分别决定边缘保留程度和下采样速度。
写在最后
学术因方向、个人实验和写作能力以及具体创新内容的不同而无法做到一通百通,关注UP:Ai学术叫叫兽
在所有资料中留下联系方式以便在科研之余为家人们答疑解惑,本up主获得过国奖,发表多篇SCI,擅长目标检测领域,拥有多项竞赛经历,拥有软件著作权,核心期刊等经历。
因为经历过所以更懂小白的痛苦!
因为经历过所以更具有指向性的指导!
祝所有科研工作者都能够在自己的领域上更上一层楼!