【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 等

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐