Skip to content

CNN 主线

本页梳理卷积神经网络(CNN)经典分类架构的主线里程碑。CNN 是深度学习三大架构族之一(见 深度学习概览),专为网格状数据(图像)设计。目标检测(目标检测与 YOLO)与图像分割(图像分割)等下游任务都建立在这些骨干架构之上。

CNN 的核心思想:不要让每个神经元都看整张图,而是用小窗口逐块扫描。

想象你拿一个 3×3 的小放大镜在图片上从左到右、从上到下滑动——每到一个位置,就计算”这个小区域和放大镜里的模式有多匹配”。这个放大镜就是卷积核(filter / kernel)——一个由可学习权重组成的小矩阵,相当于一个可在整张图上复用的”特征探测器”。

  • 卷积核 = 特征探测器:一个核负责检测”竖线”,另一个检测”横线”,还有一个检测”拐角”。一整层有几十上百个核,各自检测不同特征。
  • 逐层抽象:浅层检测简单边缘 → 中层组合成纹理、部件 → 深层拼出完整物体。就像人眼从像素到笔画到字到句的逐层理解。
  • 参数共享:同一个核在整张图上反复使用——不管”猫耳朵”出现在左上角还是右下角,同一个核都能检测到。这就是 CNN 比全连接网络参数少得多、且对位置不敏感的原因。
  • 局部连接:每个输出像素只依赖输入的一小块局部区域(而非整张图),这与人眼视觉皮层的工作方式类似,也被称为局部归纳偏置(local inductive bias)。

为什么不用全连接网络处理图像? 一张 224×224×3 的图片展平后有 150528 个值,若第一个全连接层有 1000 个神经元,仅这一层就有约 1.5 亿参数——不但容易过拟合,而且完全丢失了像素之间的空间邻接关系。CNN 的卷积层对一个 224×224×3 输入、用 64 个 3×3 核,参数量仅 64 × 3 × 3 × 3 = 1728 个,相差近 10 万倍。

在深度学习爆发之前,计算机视觉(CV)完全依赖手工设计特征(hand-crafted features)——研究者凭经验和领域知识精心设计一套”配方”,从图像中提取边缘、角点、纹理等统计量,再交给 SVM 等分类器。CNN 的革命性在于:不再由人设计特征,而是让网络从数据中自动学习特征。更多传统 CV 方法详见传统计算机视觉与传统方法 vs 深度学习。

维度手工特征(SIFT / HOG / SURF)CNN 自动学习特征
特征来源人工设计固定算法提取从数据中端到端自动学习
典型流程提特征 → 量化编码 → SVM 分类端到端:像素 → 类别
优点可解释、计算量小、无需 GPU性能远超手工特征,泛化强
缺点天花板低、每换一个任务就要重新设计需要大量标注数据与 GPU 算力
代表方法SIFT (1999)、HOG (2005)、SURF (2006)AlexNet (2012)、ResNet (2015)、ConvNeXt (2022)
历史转折ImageNet 2012:AlexNet Top-5 错误率 15.3%手工特征最佳方法约 25%,差距 10 个百分点

发展脉络:1999 年 Lowe 提出 SIFT(尺度不变特征变换),2005 年 Dalal & Triggs 用 HOG + SVM 做行人检测达到当时的实用水平。2012 年 AlexNet 在 ImageNet 大赛中碾压手工特征方法,标志着特征学习取代手工特征成为主流。但手工特征并未消亡——在计算资源受限的嵌入式设备上,SIFT/HOG 仍然是首选(详见传统方法 vs 深度学习)。

一个 3×3 卷积核在 5×5 特征图上滑动,每次覆盖一个局部区域,做逐元素相乘再求和:

卷积核的步长(stride)——滑窗每次移动的像素数,stride=1 表示逐像素滑动,stride=2 表示跳一格、输出尺寸约减半;填充(padding)——在输入边缘补零,用于控制输出尺寸("same" 填充让输出与输入等大)。

对于二维卷积层,设输入特征图为 X、卷积核为 W、偏置为 b,则输出特征图在位置 (i, j) 的值为:

Y(i,j)=∑m=0k−1∑n=0k−1X(i+m,j+n)⋅W(m,n)+bY(i, j) = \sum_{m=0}^{k-1} \sum_{n=0}^{k-1} X(i+m, j+n) \cdot W(m,n) + b

其中 k 是卷积核边长。严格来说,深度学习中的”卷积”实际上是互相关(cross-correlation)——它不翻转卷积核,但因为权重是学出来的,翻转与否不影响表达能力,业界习惯仍叫它卷积。

对于多通道输入(如 RGB 三通道或上一层产生的 64 通道特征图),卷积核也是一个 3D 张量:核的深度始终等于输入通道数 C_in,沿输入的全部通道做逐元素乘加后求和成单个数。因此一个核无论输入多少通道,只产生一个输出通道。要产生 C_out 个输出通道,就需要 C_out 个核,所以一层卷积的参数量为:

Params=Cout×(k×k×Cin+1)\text{Params} = C_{out} \times (k \times k \times C_{in} + 1)

以 Conv2d(3, 64, kernel_size=3, padding=1) 为例:参数量 = 64 × (3×3×3 + 1) = 64 × 28 = 1792 个。

给定输入尺寸 W_in、卷积核大小 k、步长 s、单边填充 p,输出特征图的边长为:

Wout=⌊Win+2p−ks⌋+1W_{out} = \left\lfloor \frac{W_{in} + 2p - k}{s} \right\rfloor + 1

例如输入 224、核 3×3、stride 1、padding 1:W_out = ⌊(224 + 2 − 3) / 1⌋ + 1 = 224(尺寸不变)。若 stride 2、padding 1:W_out = ⌊(224 + 2 − 3) / 2⌋ + 1 = 112(减半)。

这个公式是所有 CNN 尺寸推导的基础——给定输入分辨率和网络结构,沿每一层套用此式即可算出最终特征图大小,进而算出感受野和参数量。

**感受野(receptive field)**指特征图上一个输出像素对应输入图像的区域大小。单层 3×3 卷积的感受野就是 3。堆叠两层 3×3 卷积的感受野为 5(而非 9),因为第二层的每个像素看的是第一层的 3×3 区域,而第一层每个像素又各自看了输入的 3×3 区域,合并起来的有效覆盖范围是 5×5。

递推公式:设第 l 层的感受野为 R_l、步长为 s_l,则从第 l−1 层到第 l 层的感受野递推为:

Rl=Rl−1+(kl−1)×∏i=1l−1siR_l = R_{l-1} + (k_l - 1) \times \prod_{i=1}^{l-1} s_i

其中 s_1 × s_2 × ... × s_(l-1) 是前面所有层步长的连乘积(即当前层一个像素的跳幅对应输入上的多少像素)。初始 R_0 = 1。

以 VGG-16 为例,所有卷积都是 3×3、stride 1,5 次 stride-2 池化。最终 7×7 特征图上每个像素的感受野 = 1 + 2×(1+1+1+1+1+1+1+1+1+1+1+1+1) ≈ 196,即一个像素”看到”输入上约 196×196 的区域。

感受野决定了网络能利用多大范围的上下文。感受野太小会导致网络看不到整个物体;但单纯增大感受野也不一定提升性能——**有效感受野(effective receptive field)**呈高斯分布,中心区域贡献远大于边缘。

  • 参数量:一层卷积的参数量 = C_out × (k × k × C_in + 1)(同上)。注意与全连接层相比,卷积参数量与输入分辨率无关——这是参数共享的直接体现。
  • 计算量(FLOPs):每个输出像素需要 k × k × C_in 次乘加,整层共 H_out × W_out × C_out 个输出像素,故:
FLOPs≈Hout×Wout×Cout×k×k×Cin\text{FLOPs} \approx H_{out} \times W_{out} \times C_{out} \times k \times k \times C_{in}

可以看到计算量与输入分辨率、通道数的乘积成正比——这就是为什么高分辨率图像推理开销巨大,也是 MobileNet 等轻量网络用深度可分离卷积(depthwise separable convolution)(把标准卷积拆成逐通道卷积 + 1×1 逐点卷积两步)把计算量降到约 1/C_out + 1/k² 分之一的原因。

卷积和加偏置本质上是线性运算——堆叠再多层,整体仍等价于一个单层线性变换。要引入非线性,必须在卷积后加激活函数。CNN 最常用的是 ReLU(Rectified Linear Unit,修正线性单元):

ReLU(x)=max⁡(0,x)\text{ReLU}(x) = \max(0, x)

ReLU 把所有负值截断为 0、正值原样保留。优点:计算极快(一次比较)、在正区间梯度恒为 1(缓解梯度消失)、让网络学到稀疏表示(部分神经元输出为 0)。现代网络有时用其变体 LeakyReLU(负区间给一个小斜率如 0.01)或 GELU(Transformer 常用,平滑的 ReLU)。

**批量归一化(Batch Normalization, BN)**在每个 mini-batch 内对一层的输出做标准化(减均值、除标准差),再用两个可学习参数 γ、β 做缩放和偏移,使各层输入分布保持稳定。公式:

x^=x−μBσB2+ε,y=γ⋅x^+β\hat{x} = \frac{x - \mu_B}{\sqrt{\sigma_B^2 + \varepsilon}}, \quad y = \gamma \cdot \hat{x} + \beta

BN 把”内部分布漂移(internal covariate shift)“问题大幅缓解,让学习率可以开得更大、训练更快更稳,是 2015 年以后现代 CNN 的标配组件。通常插在卷积之后、激活之前(Conv → BN → ReLU)。

推理时的 BN:测试时没有 mini-batch,BN 使用训练阶段累积的移动平均统计量(running_mean / running_var),因此 BN 层在推理时常可被”折叠”进前一层的卷积权重中(Conv+BN → 单个 Conv),不增加任何推理开销。

ResNet 的突破在于残差连接(skip connection):把输入直接”短路”跳过若干层,与输出相加。这让 152 层的极深网络也能正常训练——没有它,层数一深梯度就消失/爆炸。

直觉:网络只需学习”输入和输出的差异(残差)“,而不是从零学起。当最优变换接近恒等映射时,网络把残差推到 0 即可——比学一个恒等映射容易得多。

ResNet 要解决的具体问题是退化问题(degradation problem):理论上网络越深容量越大应该更好,但实际上超过 20~30 层后准确率反而下降——这不是过拟合,而是梯度消失/爆炸导致深层根本学不动。残差连接最坏情况下 F(x) 学到 0,整体退化为恒等映射(y = x),所以更深的网络不会比浅的更差。

类比:想象老师让一个学生把试卷上每个错误都改对(学完整映射 F(x))。这很难。但如果老师说”我给你一份标准答案,你只改还错的题”(学残差 F(x)),改动量小得多,也更容易学会。残差连接就是那把”标准答案直通车”。

梯度层面的解释:残差相加让反向传播的梯度链多了一条”直通回路”——∂y∂x=∂F(x)∂x+1\frac{\partial y}{\partial x} = \frac{\partial F(x)}{\partial x} + 1,那个 “+1” 保证梯度不会在链式求导中连乘衰减到零,这就是”梯度高速公路”的数学本质。

以下是标准残差块的内部结构——两个 3×3 卷积 + 跳线连接:

注意那条从 x 直接连到 ⊕ 的”跳线”(skip connection)——即使 F(x) 学不到东西,x 也能无损通过。跳线连接构建了梯度回传的”高速公路”。

import torch
import torch.nn as nn
# 一个最小化的 CNN:2 个卷积块 + 1 个全连接分类头
class SimpleCNN(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 16, 3, padding=1), # 卷积:3通道→16通道,3×3核
nn.ReLU(), # 激活函数
nn.MaxPool2d(2), # 2× 下采样:尺寸减半
nn.Conv2d(16, 32, 3, padding=1), # 卷积:16→32通道
nn.ReLU(),
nn.MaxPool2d(2),
)
self.classifier = nn.Linear(32 * 8 * 8, num_classes) # 全连接分类
def forward(self, x):
x = self.features(x) # 提取特征
x = x.view(x.size(0), -1) # 展平:(B, 32, 8, 8) → (B, 2048)
return self.classifier(x)
model = SimpleCNN(num_classes=10)
print(model)
print(f"参数量: {sum(p.numel() for p in model.parameters()):,}")

上面假设输入是 32×32(CIFAR-10 尺寸),两次 MaxPool2d(2) 后特征图为 8×8,所以展平维度是 32 × 8 × 8 = 2048。如果输入是 224×224,需要相应调整为 32 × 56 × 56。

以下实现标准残差块(ResNet-18/34 使用的基础块),注意跳线连接如何对齐维度:

class ResidualBlock(nn.Module):
"""标准残差块(ResNet-18/34 使用的基础块)"""
def __init__(self, in_ch, out_ch, stride=1):
super().__init__()
# 主路径:两个 3×3 卷积
self.conv1 = nn.Conv2d(in_ch, out_ch, 3, stride=stride, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(out_ch)
self.conv2 = nn.Conv2d(out_ch, out_ch, 3, stride=1, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(out_ch)
self.relu = nn.ReLU(inplace=True)
# 跳线:通道数或分辨率变化时需要 1×1 卷积对齐维度
self.skip = nn.Identity() if in_ch == out_ch and stride == 1 else \
nn.Sequential(nn.Conv2d(in_ch, out_ch, 1, stride=stride, bias=False), nn.BatchNorm2d(out_ch))
def forward(self, x):
out = self.relu(self.bn1(self.conv1(x))) # Conv1 → BN → ReLU
out = self.bn2(self.conv2(out)) # Conv2 → BN
return self.relu(out + self.skip(x)) # 残差相加后 ReLU
# 验证:输入 [1, 64, 56, 56] → 输出 [1, 128, 28, 28]
blk = ResidualBlock(64, 128, stride=2)
x = torch.randn(1, 64, 56, 56)
print(blk(x).shape) # 输出: torch.Size([1, 128, 28, 28])

注意 self.skip:当主路径改变了通道数或分辨率(stride>1)时,跳线必须用 1×1 卷积做投影,把 x 的形状对齐到与主路径输出一致才能相加。bias=False 是因为后面跟 BN,BN 自带可学习偏移,卷积偏置冗余。

  • 输入要归一化:图像像素值 0–255,先除以 255 缩放到 [0, 1],或做 transforms.Normalize(mean, std) 标准化(ImageNet 的 mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])。不归一化会导致训练极不稳定。
  • 数据增强是免费的性能提升:训练时随机翻转、裁剪、颜色抖动(ColorJitter)能让模型见过更多变化,显著抑制过拟合。进阶方法如 MixUp(把两张图及其标签线性混合)、CutMix(把一张图的局部块贴到另一张上)、RandAugment(随机组合多种增强)在 ImageNet 上普遍带来 1–3 个百分点的 Top-1 提升。
  • 学习率调度:训练初期用较大学习率快速逼近,后期逐步衰减。常用 余弦退火(Cosine Annealing)(学习率沿余弦曲线降到接近 0)或 StepLR(每若干 epoch 衰减一次)。更稳的做法是配合 Warmup(前几个 epoch 学习率从 0 线性升到目标值),避免初始阶段发散。
  • 优化器选择:SGD + Momentum 在大量 epoch 训练时泛化最好,是 ResNet/ImageNet 训练的经典选择;AdamW 收敛更快、调参更省心,是 ConvNeXt/ViT 等现代架构的默认选择。
  • 标签平滑(Label Smoothing):把硬标签 [0, 1, 0] 软化为 [0.033, 0.933, 0.033],防止模型对训练标签过度自信,通常提升 0.5–1 个百分点。
  • 池化层降维:MaxPool2d(2) 把特征图尺寸减半、通道数不变——既减少计算量,又让感受野逐层增大。
  • 深层网络用残差连接:超过 10 层的 CNN,不加残差连接很难训练。PyTorch 的 torchvision.models.resnet18/50 开箱即用。
  • 不要从零训练:除非数据量超大(百万级),否则用预训练模型(weights=ResNet18_Weights.DEFAULT)做迁移学习,效果远好于从零开始。用 torchvision.models.resnet50(weights=ResNet50_Weights.DEFAULT) 加载预训练权重,替换最后全连接层即可微调你的数据集——几十行代码搞定。
  • 卷积核大小:几乎总是 3×3。大核用多个 3×3 堆叠替代(两个 3×3 的感受野 = 一个 5×5,但参数更少且非线性更强)。例外:2022 年起的 RepLKNet、ConvNeXt-V2 等现代架构重新启用 7×7 甚至 31×31 大核,借助**重参数化(re-parameterization)**和深度可分离卷积把大核的开销压下来。
  • BatchNorm 是标配:卷积后、激活前加 BN,能加速收敛、稳定训练。现代 CNN 的标配组件。
  • 池化 vs 步长卷积:下采样可以用池化(MaxPool)也可以用 stride=2 的卷积。后者可学习,通常效果略好。
  • 权重初始化:默认的随机初始化(如 Kaiming 初始化)对浅网络够用;深层或自定义结构建议显式调用 nn.init.kaiming_normal_,让初始方差不随层数爆炸或消失。
  • 何时不用 CNN:对于序列数据(文本、时间序列),Transformer 已取代 CNN;但图像的局部归纳偏置(平移不变性)让 CNN 在小数据量时仍比 ViT 更高效。
  • ImageNet 图像分类:ResNet 在 ILSVRC 2015 以 3.57% 错误率夺冠,此后 ResNet-50 成为整个计算机视觉领域最通用的预训练 backbone,无数下游任务的默认起点。
  • 视频理解:用 3D CNN(如 I3D、SlowFast)对视频帧序列提取时空特征,用于短视频平台的动作识别、内容审核和精彩片段自动剪辑。
  • 人脸识别:Apple Face ID 解锁手机、支付宝刷脸支付,CNN 提取人脸深度特征并与注册模板比对,在毫秒内完成身份验证。
  • 医学影像分析:腾讯觅影、Google Health 用 CNN 检测 CT / MRI 中的肺结节、眼底病变和肿瘤病灶,辅助放射科医生提高筛查效率。
  • 自动驾驶感知:特斯拉、Mobileye 的视觉感知系统用 CNN 识别车道线、交通标志、行人和车辆,是辅助驾驶(ADAS)的核心感知模块。
  • 工业质检:产线上用 CNN 检测产品表面的划痕、凹陷、缺件等缺陷,替代人工质检并实现 24 小时高速筛查,漏检率远低于人工。
  • 卫星遥感分析:Google Earth 用 CNN 做土地利用分类、Maxar 用它识别建筑与道路的变化,支撑城市规划与灾害评估。
  • 边缘设备与移动端:手机上的实时人像虚化、ARKit 体感追踪、无人机避障都依赖在端侧运行的轻量 CNN(如 MobileNet、EfficientNet-Lite),延迟低至毫秒级且无需上传云端,兼顾隐私与实时性。
年份模型人物/团队要点
1980Neocognitron福岛邦彦CNN 结构前身,非反向传播训练
1989/1998LeNet / LeNet-5LeCun 等(AT&T Bell Labs)首次 BP+卷积结合;1998 论文用于银行支票识别
2012AlexNetKrizhevsky, Sutskever, Hinton(多伦多大学)ILSVRC-2012 冠军(Top-5 错误率 15.3%,领先第二名约 10 个百分点),ReLU+Dropout+GPU,深度学习走向主流的标志
2014VGG / GoogLeNet牛津 VGG 组 / Google小卷积核堆叠 / Inception 模块
2015ResNet何恺明、张祥雨、任少庆、孙剑(MSRA)残差连接使 152 层可训练,ILSVRC-2015 冠军
2017DenseNetHuang 等(康奈尔)密集连接,每层接所有前层
2019EfficientNetTan & Le(Google)复合缩放,同时缩放深度/宽度/分辨率
2022ConvNeXtLiu 等(Meta)用现代设计纯 CNN 追平 ViT,证明 CNN 路线未死
2023ConvNeXt-V2Woo 等(Meta / KAIST)引入 FCMAE 自监督预训练 + 全局响应归一化(GRN),刷新纯 CNN 记录
2024MobileNetV4Google硬件感知神经架构搜索(NAS)+ 通用 Inverted Bottleneck,专为移动端推理优化
2024–2025InternImage / RepLKNet v2OpenGVLab / MEGVII可变形卷积 v3、超大核 + 重参数化,在检测/分割下游任务上追平或超过 ViT 骨干

2022 年 ConvNeXt 证明了”纯卷积 + 现代训练配方”可以追平当时最先进的 Vision Transformer(ViT)。2023 年的 ConvNeXt-V2 进一步加入两项改进:

  1. FCMAE(Fully Convolutional Masked Autoencoder):一种适配卷积的自监督预训练方法,随机遮住输入图像 60% 的 patch,让网络学会重建被遮挡部分,与 ViT 的 MAE 思路对齐。
  2. GRN(Global Response Normalization,全局响应归一化):在特征图通道维度做归一化,增强有用通道、抑制冗余通道,弥补深层 ConvNeXt 特征崩溃的问题。

ConvNeXt-V2 在 ImageNet-1K 上把纯 CNN 的 Top-1 准确率推到 88.9%(使用 1B 参数 + 3.8B 数据的预训练),缩小甚至抹平了与最先进 ViT 的差距,说明卷积路线并未过时。

CNN vs Vision Transformer:共识与分工

Section titled “CNN vs Vision Transformer:共识与分工”

经过 2021–2025 的几年争论,学界对”CNN 还是 ViT”已形成较清晰的共识:

  • ViT 的优势在”大数据、强算力”场景:当预训练数据达到数亿张图(如 JFT-300M、LAION)、模型规模上亿参数时,ViT 缺乏归纳偏置反而成为优势——容量更大、可扩展性更好,DINOv2、SigLIP、CLIP 等基础模型均采用 ViT。
  • CNN 的优势在”小数据、低算力、强局部性”场景:数据量有限(几万张)、延迟敏感(移动端/边缘端)、任务依赖精细局部纹理(医学影像、工业质检)时,CNN 的局部归纳偏置让它用更少数据和算力达到更优效果。
  • 融合架构成为主流:MobileViT、EfficientFormer、CoAtNet 等混合架构在前端用卷积提取局部特征、在后端用 Attention 建模全局关系,兼顾效率与表达力。

2022–2025 年出现了”大核复兴”趋势:RepLKNet 使用 31×31 的超大卷积核(配合深度可分离卷积和结构重参数化把开销控制住),证明大核也能获得与 ViT 全局注意力相当的有效感受野;InternImage 把**可变形卷积 v3(Deformable Convolution v3)**作为核心算子,让采样位置可学习、自适应物体形状,在 COCO 检测和 ADE20K 分割上持续领先。

2024–2025 年,端侧 AI 爆发让高效 CNN 重新成为焦点:

  • 手机端实时推理:Google 的 MobileNetV4 用硬件感知 NAS 自动搜索在特定芯片(手机 NPU、Apple Neural Engine)上推理最快的结构,在同等精度下比 MobileNetV3 快 20–50%。
  • 可穿戴设备与 IoT:智能手表的心律失常检测、智能眼镜的实时手势识别,在毫瓦级功耗预算下只能跑深度可分离 CNN。
  • 端侧生成式 AI 中的 CNN:Stable Diffusion 的 VAE 解码器、扩散模型的下采样/上采样模块仍是卷积结构,2025 年的 MobileDiffusion、Snapfusion 等端侧扩散模型大量使用优化后的 CNN。
  • 无人机与机器人感知:200g 以下的无人机无法搭载大 GPU,其避障与目标跟踪几乎全部依赖 Quantized CNN(INT8 量化卷积),在树莓派级算力上实现 60 FPS 实时推理。

受 MAE(Masked Autoencoders)在 ViT 上成功的启发,2023–2025 年出现了多种针对 CNN 的自监督预训练方法(ConvNeXt-V2 的 FCMAE、DINO 的 CNN 变体等),让纯 CNN 也能从无标注大规模数据中受益,缩小了与 ViT 在预训练数据利用上的差距。

类库语言说明
torchvisionPythonPyTorch 官方视觉库,内置 ResNet/VGG/AlexNet 等经典 CNN 模型与预训练权重
timmPython第三方模型库,收录数百种预训练 CNN 与 ViT(含 ConvNeXt 全系列),迁移学习首选
PyTorchPython灵活的深度学习框架,nn.Conv2d 等模块让搭 CNN 像搭积木
TensorFlow / KerasPythonGoogle 深度学习框架,tf.keras.applications 提供开箱即用的经典 CNN
Detectron2PythonMeta 开源的视觉库,提供 CNN 骨干 + 检测/分割头,研究常用
OpenCVC++/Python视觉基础库,用于图像预处理、数据增强和检测结果可视化
ONNX Runtime / TensorRTPython / C++把训练好的 CNN 导出为 ONNX 后做推理加速,边缘部署常用
术语英文解释
卷积Convolution用小窗口在输入上滑动做逐元素乘加,提取局部特征的核心运算
卷积核Filter / Kernel卷积操作中滑动的小权重矩阵,相当于一个特征探测器
特征图Feature Map卷积层的输出,每个通道对应一个核检测到的特征响应
步长Stride卷积滑窗每次移动的像素数;stride=2 会让输出尺寸约减半
填充Padding在输入边缘补零,用于控制输出尺寸,“same” 填充让输出与输入等大
池化Pooling对局部区域取最大值或平均值来降低特征图分辨率的下采样操作
感受野Receptive Field一个输出像素对应的输入图像区域大小,逐层递增
有效感受野Effective Receptive Field感受野内各像素对输出的实际贡献分布(近似高斯),中心区域远大于边缘
激活函数Activation Function引入非线性的逐元素函数,ReLU 是 CNN 最常用的一种
批归一化Batch Normalization (BN)在卷积后、激活前对特征做标准化,加速收敛、稳定训练,是现代 CNN 的标配组件
残差连接Skip Connection把输入直接跨层加到输出上,使极深网络也能正常训练
迁移学习Transfer Learning用在大数据集上预训练的模型权重作为起点,在小数据集上微调
DropoutDropout训练时随机丢弃部分神经元,抑制过拟合的正则化手段
残差块Residual BlockResNet 的基本单元,通过跳线将输入直接加到输出上(y = F(x) + x),使深层网络可训练
恒等映射Identity Mapping当残差 F(x) 学到 0 时整体退化为 y = x,保证更深的网络不会比浅网络更差
瓶颈结构Bottleneck Block用 1×1→3×3→1×1 的三层结构先降维再升维,在减少参数量的同时保持表达能力
深度可分离卷积Depthwise Separable Convolution把标准卷积拆成逐通道卷积 + 1×1 逐点卷积两步,大幅降低参数量和计算量,MobileNet 的核心算子
数据增强Data Augmentation通过翻转、裁剪、颜色抖动等手段人工扩充训练样本,抑制过拟合
标签平滑Label Smoothing把硬标签软化为一组概率分布,防止模型对训练标签过度自信
余弦退火Cosine Annealing学习率沿余弦曲线逐步降到接近 0 的调度策略,常配合 Warmup 使用
结构重参数化Structural Re-parameterization训练时用多分支结构、推理时等价合并为单分支,既享受训练收益又不增加推理开销
可变形卷积Deformable Convolution让卷积采样位置可学习,自适应物体几何形变,InternImage 的核心算子
  • AlexNet 的历史定位:ILSVRC-2012 是深度学习走向主流的标志事件。不过 Schmidhuber 阵营指出 Ciresan 组 2011 年已用 GPU CNN 在竞赛中获胜,AlexNet 并非技术原创起点,而是工程集大成者。
  • ResNet 发表年份:arXiv 预印本 2015-12,CVPR 2016 正式发表,两种年份标注均正确。残差连接让 152 层网络可训练,论文被引超 20 万次,残差思想已渗透所有现代架构(Transformer 每层都有残差连接)。
  • 后续发展:DenseNet(2017,密集连接)、EfficientNet(2019,复合缩放)、ConvNeXt(2022,用现代设计纯 CNN 追平 ViT)、ConvNeXt-V2(2023,自监督 FCMAE + GRN)。
  • CNN 与 ViT 的关系:2020 年 ViT 出现后一度有”CNN 将死”的论调,但 ConvNeXt(2022)和后续大核网络证明卷积路线仍有竞争力。目前的共识是两者互补——ViT 擅长大数据强算力场景,CNN 擅长小数据、低延迟和局部纹理敏感任务,融合架构(MobileViT、CoAtNet)是工程落地的主流选择。
  • 2025–2026 趋势:端侧 AI 爆发让高效 CNN(MobileNetV4、量化 CNN)重新受到重视;可变形卷积与大核卷积让纯 CNN 在检测/分割下游任务上保持领先;自监督预训练方法(FCMAE 等)让 CNN 也能利用无标注大规模数据。可参考 Vision Transformer 主线 对比 ViT 的发展。