【AI课程领学】第四课1/3:CNN 基本组件与操作——卷积/步幅/填充/池化/归一化/激活/感受野(含 PyTorch + NumPy)
【AI课程领学】第四课1/3:CNN 基本组件与操作——卷积/步幅/填充/池化/归一化/激活/感受野(含 PyTorch + NumPy)
·
【AI课程领学】第四课1/3:CNN 基本组件与操作——卷积/步幅/填充/池化/归一化/激活/感受野(含 PyTorch + NumPy)
【AI课程领学】第四课1/3:CNN 基本组件与操作——卷积/步幅/填充/池化/归一化/激活/感受野(含 PyTorch + NumPy)
文章目录
欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可扫描博文下方二维码 “
学术会议小灵通”或参考学术信息专栏:https://ais.cn/u/mmmiUz
详细免费的AI课程可在这里获取→www.lab4ai.cn
1. 为什么 CNN 适合视觉与遥感等栅格数据?
CNN 的核心归纳偏置(inductive bias):
- 局部连接(locality):附近像素相关性更强
- 权重共享(weight sharing):同一模式可在不同位置出现
- 平移等变性(translation equivariance):输入平移→特征平移
这使得 CNN 在图像、遥感栅格、医学影像、气象场等二维/三维结构数据上表现稳定。
2. 卷积的数学形式与维度计算(你可以直接做成图)
2.1 二维卷积(Cross-correlation 形式)
- 深度学习框架实现的“卷积”通常是互相关:

- c i c_i ci:输入通道(RGB 或多光谱波段)
- c o c_o co:输出通道(卷积核组数)
2.2 输出尺寸公式(非常常考)
- 输入 H × W H×W H×W,kernel K K K,stride S S S,padding P P P:

3. CNN 的基本组件
3.1 卷积层 Conv2d
import torch
import torch.nn as nn
x = torch.randn(2, 3, 64, 64) # B,C,H,W
conv = nn.Conv2d(3, 16, 3, stride=1, padding=1) # same padding
y = conv(x)
print("x:", x.shape, "y:", y.shape) # 2,16,64,64
print("params:", sum(p.numel() for p in conv.parameters()))
- 要点:卷积参数量与输入尺寸无关,只与
Cin, Cout, K有关,这是 CNN 高效的关键之一。
3.2 步幅 stride 与下采样
- stride=2 可以替代 pooling 做下采样:
conv_s2 = nn.Conv2d(3, 16, 3, stride=2, padding=1)
y2 = conv_s2(x)
print(y2.shape) # (2,16,32,32)
- 工程上常见:用 stride=2 的卷积做下采样 + 提升表示能力。
3.3 填充 padding:保持尺寸与边界信息
padding=1+kernel=3+stride=1常用来保持 H,W 不变- 过多 padding 会引入边界伪影,遥感拼接/裁块训练时要注意边界效应
3.4 池化 pooling:MaxPool vs AvgPool
pool = nn.MaxPool2d(kernel_size=2, stride=2)
yp = pool(y)
print(yp.shape) # (2,16,32,32)
- MaxPool 更强调纹理/边缘“显著响应”
- AvgPool 更平滑,分类尾部常用 GlobalAvgPool
3.5 激活函数:ReLU / GELU
act = nn.ReLU()
ya = act(y)
- ReLU 优点:简单、梯度不易消失;缺点:可能“死 ReLU”(输出全 0),可用 LeakyReLU/SiLU 缓解。
3.6 归一化:BatchNorm2d
- BN 能显著提升训练稳定性与收敛速度:
bn = nn.BatchNorm2d(16)
y_bn = bn(y)
print(y.mean().item(), y_bn.mean().item())
- 注意:小 batch(如遥感高分辨率训练常见)BN 统计不稳 → 可换 GroupNorm/InstanceNorm。
3.7 感受野 Receptive Field(RF):CNN “看多大范围”
简单直觉:
- 堆叠多层 3×3 卷积,感受野增长
- 下采样(stride/pool)会加速感受野扩大
一个常用经验:多层 3×3 比 7×7 更好(参数更少、非线性更多)。
4. NumPy:手写一个“单通道卷积”理解卷积本质
import numpy as np
def conv2d_single(x, k):
H, W = x.shape
KH, KW = k.shape
out_h, out_w = H - KH + 1, W - KW + 1
y = np.zeros((out_h, out_w), dtype=np.float32)
for i in range(out_h):
for j in range(out_w):
y[i, j] = np.sum(x[i:i+KH, j:j+KW] * k)
return y
x = np.random.randn(6, 6).astype(np.float32)
k = np.array([[1,0,-1],[1,0,-1],[1,0,-1]], dtype=np.float32) # 简单边缘检测核
y = conv2d_single(x, k)
print(y.shape)
5. 小结 + 常见坑
要点回顾
- CNN 的优势来自局部连接 + 权重共享
- stride/padding 控制尺度变化
- BN/激活/池化构成基本积木
- 感受野决定“上下文范围”
常见坑
- 忘了
model.eval()导致 BN/Dropout 推理不稳 - 小 batch 用 BN 效果差
- 裁块训练边界效应(padding 引入伪影)
下一篇进入经典结构:LeNet/AlexNet/VGG/Inception/ResNet/MobileNet 等。
更多推荐

所有评论(0)