CNN 深度技术详解:从卷积数学原理到现代计算机视觉工程实践

CNN(Convolutional Neural Network,卷积神经网络)是深度学习历史上最重要的模型架构之一。

从图像分类、目标检测、图像分割,到OCR、人脸识别、医学影像和视频分析,CNN曾经长期占据计算机视觉的核心位置。

即使今天 Vision Transformer(ViT)和多模态大模型快速发展,CNN依然没有消失。相反,理解CNN仍然是理解现代Computer Vision、理解视觉模型和理解神经网络底层计算机制的重要基础。

本文不把CNN简单理解为“卷积 + 池化 + 全连接”,而是从数学、计算图和工程实现三个层面重新理解CNN。


一、CNN到底解决了什么问题?

假设有一张RGB图片:

224 × 224 × 3

如果使用传统全连接神经网络:

224 × 224 × 3
     150528
     Dense
     Dense
    Prediction

第一个全连接层假设有1000个神经元,那么参数数量:

150528 × 1000
≈ 150 million

这会产生两个严重问题:

  1. 参数量巨大
  2. 完全忽略图像的空间结构

图片中相邻像素通常具有强相关性:

Pixel
Neighbor Pixel
Local Pattern
Object

例如:

边缘
纹理
局部形状
物体部件
完整物体

CNN的核心思想就是:

利用局部连接和参数共享,在保持空间结构的同时提取视觉特征。


二、CNN最核心的三个思想

CNN真正重要的不是“卷积”两个字,而是三个设计思想:

1. Local Connectivity
2. Parameter Sharing
3. Hierarchical Feature Learning

2.1 Local Connectivity:局部连接

假设:

5 × 5 Image

我们不让一个神经元连接所有25个像素,而只观察:

3 × 3

区域:

┌───────────────┐
│               │
│   ┌───────┐   │
│   │ 3 × 3 │   │
│   │ Kernel│   │
│   └───────┘   │
│               │
└───────────────┘

这样神经元只关注局部区域。

这与视觉系统中的局部感受野具有一定的对应关系。


三、Parameter Sharing:参数共享

这是CNN最重要的设计之一。

假设一个3×3卷积核:

1  0 -1
1  0 -1
1  0 -1

它可能用于检测:

垂直边缘。

这个Kernel不是只使用一次,而是在整张图片上滑动:

Image
Kernel
左上区域
右移
继续计算
整个Image

也就是说:

同一组参数被重复用于不同空间位置。

这就是参数共享。


四、卷积到底在计算什么?

假设输入:

3 × 3

为:

1  2  3
4  5  6
7  8  9

Kernel:

1  0
0  1

进行一次卷积:

1×1 + 2×0
+ 4×0 + 5×1

得到:

6

Kernel向右移动:

2 3
5 6

得到:

2×1 + 3×0
+ 5×0 + 6×1
= 8

继续移动:

3 4
6 7

得到:

10

于是形成:

6   8
12  14

这就是Feature Map。


五、严格来说,CNN使用的是Cross-Correlation

很多教材直接把这个操作叫Convolution。

但从数学定义来说,深度学习框架中的:

torch.nn.Conv2d

通常执行的是cross-correlation,而不是严格意义上的数学卷积。

严格卷积需要:

Kernel Flip

即:

a b
c d

变成:

d c
b a

而深度学习中通常直接使用原始Kernel进行滑动计算。

由于Kernel参数本身是通过训练学习得到的,因此这种差异通常不影响神经网络的表达能力。


六、CNN输入数据到底是什么?

对于普通RGB图片:

Height × Width × Channels

例如:

224 × 224 × 3

但是PyTorch默认格式是:

Batch × Channels × Height × Width

即:

N × C × H × W

例如:

32 × 3 × 224 × 224

表示:

Batch = 32
Channels = 3
Height = 224
Width = 224

这是PyTorch CNN开发必须熟悉的数据格式。


七、一个卷积层包含什么?

例如:

nn.Conv2d(
    in_channels=3,
    out_channels=64,
    kernel_size=3
)

含义:

输入Channel
     3
3 × 3 Kernel
64个Filter
64个Feature Maps

所以:

Output Channels = Number of Filters

八、卷积核和Filter有什么区别?

实际工程中经常混用。

对于:

Input Channels = 3

一个完整Filter实际上不是:

3 × 3

而是:

3 × 3 × 3

因为它需要覆盖RGB三个Channel。

如果:

Input Channels = 64
Output Channels = 128
Kernel = 3 × 3

参数量:

128 × 64 × 3 × 3

再加上Bias:

128

总参数:

128 × 64 × 3 × 3 + 128
= 73856

九、卷积输出尺寸怎么算?

这是CNN面试和实际开发中非常重要的公式。

对于二维卷积:

H_out =
floor(
(H + 2P - D(K-1) - 1) / S
+ 1
)

W方向同理。

其中:

H = Input Height
W = Input Width
K = Kernel Size
P = Padding
S = Stride
D = Dilation

如果:

H = 32
K = 3
P = 1
S = 1
D = 1

那么:

H_out
=
(32 + 2 - 3) / 1 + 1
=
32

所以:

32 × 32

经过:

3 × 3
Padding=1
Stride=1

尺寸保持不变。


十、Stride:卷积移动的步长

Stride决定Kernel每次移动多少像素。

例如:

Stride = 1

表示:

每次移动1个Pixel

而:

Stride = 2

表示:

→→
每次移动2个Pixel

因此Stride越大:

Feature Map尺寸越小

例如:

224 × 224
Stride = 2
112 × 112

Stride本身就可以承担Downsampling作用。


十一、Padding:为什么需要补零?

如果没有Padding:

Input
3 × 3 Kernel
Output尺寸减少

例如:

32 × 32
3 × 3
30 × 30

连续使用很多卷积后:

32
30
28
26
...

空间尺寸会快速缩小。

Padding可以保持尺寸。

例如:

Input:
32 × 32

Padding:
1

Kernel:
3 × 3

Output:
32 × 32

十二、“Same"和"Valid”

常见概念:

Same
Valid

Valid

不Padding:

Input
Kernel
Output尺寸缩小

Same

通过Padding使:

Output ≈ Input

在Stride=1、奇数Kernel时尤其常见。


十三、多个Filter意味着什么?

假设:

Input:
224 × 224 × 3

第一层:

Conv2D
64 Filters

输出:

224 × 224 × 64

这64个Channel并不是64张原始图片。

而是:

64种不同的特征响应。

例如某些Filter可能学习:

Filter 1 → Vertical Edge

Filter 2 → Horizontal Edge

Filter 3 → Corner

Filter 4 → Texture

Filter 5 → Color Pattern

这些特征不是人工定义的,而是训练过程中自动学习出来的。


十四、CNN的层级特征学习

这是理解CNN最重要的概念之一。

CNN浅层:

Pixel
Edge

中层:

Edge
Texture
Shape

深层:

Shape
Part
Object

例如识别猫:

Layer 1
边缘

Layer 2
纹理

Layer 3
耳朵、眼睛

Layer 4
猫脸

Layer 5
Cat

这就是:

Hierarchical Representation Learning


十五、ReLU为什么需要存在?

卷积之后通常需要激活函数。

最经典的是:

ReLU(x) = max(0, x)

例如:

-3 → 0
-1 → 0
 0 → 0
 2 → 2
 5 → 5

代码:

nn.ReLU()

为什么需要它?

因为如果所有层都只是:

Linear
+
Linear
+
Linear

最终仍然可以表示成一个线性变换。

ReLU引入非线性:

Conv
ReLU
Conv
ReLU

于是网络拥有更强的表达能力。


十六、为什么CNN通常是Conv + ReLU?

经典结构:

Input
Conv
ReLU
Conv
ReLU
Pooling

现代网络可能进一步加入:

BatchNorm
Dropout
Residual Connection
Attention

形成:

Conv
BatchNorm
ReLU
Conv
Residual

十七、Pooling是什么?

Pooling用于:

降低Feature Map空间尺寸。

最经典的是Max Pooling:

2 × 2

例如:

1  3
2  4

Max Pooling:

4

对于:

4 × 4

可以变成:

2 × 2

十八、Max Pooling到底保留了什么?

例如:

1  2  1  0
3  8  2  1
0  1  5  2
2  3  1  4

2×2 Max Pool:

8  2
3  5

它保留:

局部区域中的最强激活。

所以可以理解成:

Feature Detector
强响应
Max Pooling
保留最明显特征

十九、Average Pooling

另一种是:

Average Pooling

例如:

1 2
3 4

平均值:

(1+2+3+4)/4
=2.5

相比Max Pooling:

Max Pooling
→ 强调最强特征

Average Pooling
→ 强调整体统计

现代CNN中,Global Average Pooling非常常见。


二十、Global Average Pooling

假设:

7 × 7 × 512

经过:

Global Average Pooling

变成:

1 × 1 × 512

于是得到:

512-dimensional vector

然后可以直接:

Linear
Classes

这可以减少大量参数。


二十一、经典CNN结构:LeNet

LeNet是CNN历史上的经典架构。

大致:

Input
Conv
Pooling
Conv
Pooling
FC
Output

它主要用于:

手写数字识别。

LeNet的重要意义是证明:

卷积 + 局部连接 + 参数共享可以有效解决视觉识别问题。


二十二、AlexNet:深度学习视觉革命

2012年的AlexNet是CNN发展史上的重要节点。

核心特点:

  • 更深的网络
  • ReLU
  • GPU训练
  • Dropout
  • Data Augmentation
  • Max Pooling

结构可以简化理解为:

Image
Conv
ReLU
Pool
Conv
ReLU
Pool
...
FC
Classification

AlexNet推动了深度学习重新成为Computer Vision主流。


二十三、VGG:用小卷积堆叠深度

VGG的重要思想:

使用多个3×3卷积代替较大的卷积核。

例如:

7 × 7

可以用:

3 × 3
3 × 3
3 × 3

进行堆叠。

优势:

更多非线性
更深的网络
更小的Kernel

经典:

VGG16
VGG19

二十四、为什么多个3×3比一个7×7更有吸引力?

假设单个:

7 × 7

参数:

49C²

三个:

3 × 3

参数:

27C²

同时还增加了多次非线性激活。

所以:

3×3
ReLU
3×3
ReLU
3×3

具有更强的表达能力。


二十五、ResNet:解决深层网络训练问题

随着网络越来越深:

20层
50层
100层
1000层

出现:

Degradation Problem

不是简单的过拟合,而是网络越深,优化反而变困难。

ResNet提出:

Residual Connection


二十六、Residual Connection

传统:

x
F(x)
y

ResNet:

       ┌──────────────┐
       │              │
x ─────┼→ F(x) ───────┤
       │              ↓
       └────────────→ +
                       y

数学:

y = F(x) + x

也就是说网络不直接学习:

H(x)

而是学习:

F(x) = H(x) - x

这让深层网络更容易优化。


二十七、ResNet为什么如此重要?

因为Residual Connection后来不仅影响CNN,也影响了Transformer。

现代Transformer中:

x
Attention
Add(x)
LayerNorm

也存在类似:

Residual Connection

因此:

ResNet不仅是CNN架构,它影响了现代深度学习架构设计。


二十八、Batch Normalization

BatchNorm用于稳定网络训练。

基本思想:

原始激活
Normalize
Scale
Shift

即:

x
(x - μ) / √(σ² + ε)
γx + β

它可以:

  • 稳定训练
  • 改善梯度传播
  • 加快收敛

经典CNN结构:

Conv
BatchNorm
ReLU

二十九、Dropout

Dropout是一种正则化方法。

训练过程中:

Neuron
Neuron
Neuron
Neuron

随机关闭部分神经元。

例如:

○ ○ × ○ × ○

目的是减少:

Overfitting

不过现代CNN中,随着BatchNorm、Data Augmentation、Weight Decay等方法普及,Dropout的使用方式已经发生变化。


三十、CNN完整结构

一个经典CNN可以表示:

Input Image
   Conv2D
   BatchNorm
    ReLU
   Conv2D
    ReLU
  MaxPooling
   Conv Block
   Conv Block
 Global Average Pool
    Linear
 Softmax
 Classification

三十一、Softmax是什么?

假设模型输出:

[2.1, 0.8, -1.2]

Softmax将它转成概率:

[0.75, 0.20, 0.05]

公式:

P_i = e^z_i / Σ e^z_j

最终:

Cat: 0.75
Dog: 0.20
Car: 0.05

预测:

Cat

三十二、CNN是如何训练出来的?

整个训练过程:

Image
CNN Forward
Prediction
Loss
Backpropagation
Gradient
Optimizer
Update Weights
Repeat

例如:

loss.backward()
optimizer.step()

三十三、Loss Function

分类任务常用:

Cross Entropy Loss

例如:

criterion = nn.CrossEntropyLoss()

如果真实标签:

Cat

模型预测:

Cat = 0.9
Dog = 0.1

Loss较低。

如果:

Cat = 0.01
Dog = 0.99

Loss很高。

模型通过Loss知道:

当前预测距离正确答案有多远。


三十四、CNN反向传播到底发生了什么?

Forward:

Input
Conv
ReLU
Conv
Loss

Backward:

Loss
∂Loss/∂Conv2
∂Loss/∂ReLU
∂Loss/∂Conv1
∂Loss/∂Kernel

最终更新:

Kernel

所以CNN中的:

Edge Detector
Texture Detector
Shape Detector

并不是人工写出来的。

而是:

通过反向传播自动学习出来的。


三十五、CNN如何学习一个Edge Detector?

假设模型发现:

Kernel A

能够让某种边缘产生较高激活。

那么训练过程会:

Prediction错误
Loss
Gradient
调整Kernel
Edge响应增强

经过数百万次训练样本后:

随机Kernel
有意义的Feature Detector

逐渐形成。

这就是Representation Learning。


三十六、感受野 Receptive Field

CNN另一个非常重要的概念:

Receptive Field

一个神经元最终能够“看到”原始图片中的多大区域?

例如:

Layer 1
3×3

感受野:

3×3

再经过一个:

3×3

理论感受野变成:

5×5

再加一层:

7×7

因此:

Network越深
Receptive Field越大

浅层:

Local Features

深层:

Global / Semantic Features

三十七、Dilation Convolution

普通卷积:

● ● ●
● ● ●
● ● ●

Dilation可以扩大Kernel的间隔:

●   ●   ●
         
●   ●   ●
         
●   ●   ●

这样可以:

增大感受野,同时不显著增加参数量。

常用于:

  • Semantic Segmentation
  • Image Processing
  • Dense Prediction

三十八、Depthwise Separable Convolution

普通卷积:

Input
Standard Conv
Output

Depthwise Separable Convolution:

Input
Depthwise Conv
Pointwise Conv
Output

Pointwise就是:

1 × 1 Conv

这种设计可以显著降低计算量。

典型代表:

MobileNet

三十九、1×1 Convolution有什么用?

很多人第一次看到:

Conv2d(kernel_size=1)

会觉得:

1×1卷积不是没有空间感受野吗?

它的重要作用之一是:

改变Channel维度。

例如:

56 × 56 × 256

经过:

1 × 1 Conv
64 filters

得到:

56 × 56 × 64

空间尺寸不变,但Channel从:

256 → 64

因此1×1 Conv可以理解成:

对每一个像素位置上的Channel向量进行一次Linear Projection。


四十、CNN计算量如何估算?

卷积层FLOPs通常与:

H × W × Cin × Cout × K²

有关。

例如:

H = 56
W = 56
Cin = 64
Cout = 128
K = 3

计算规模大约:

56 × 56 × 64 × 128 × 9

因此CNN优化时需要重点关注:

Feature Map Size
Channels
Kernel Size
Batch Size

四十一、CNN为什么适合GPU?

CNN本质上包含大量:

Matrix Operation
Tensor Operation
Parallel Computation

例如:

Image
Millions of Multiply-Add
GPU

GPU拥有大量计算核心,非常适合执行这类高度并行的运算。

PyTorch:

model.cuda()

就可以把模型放到GPU上。


四十二、PyTorch实现一个CNN

一个简单的CNN:

import torch
import torch.nn as nn


class CNN(nn.Module):

    def __init__(self, num_classes=10):
        super().__init__()

        self.features = nn.Sequential(
            nn.Conv2d(3, 32, 3, padding=1),
            nn.BatchNorm2d(32),
            nn.ReLU(),

            nn.Conv2d(32, 64, 3, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(),

            nn.MaxPool2d(2),

            nn.Conv2d(64, 128, 3, padding=1),
            nn.BatchNorm2d(128),
            nn.ReLU(),

            nn.AdaptiveAvgPool2d(1)
        )

        self.classifier = nn.Linear(
            128,
            num_classes
        )

    def forward(self, x):

        x = self.features(x)

        x = torch.flatten(x, 1)

        return self.classifier(x)

这里:

Input
3 × H × W
Conv 32
Conv 64
MaxPool
Conv 128
Global Average Pool
128
Linear
Classes

四十三、为什么使用AdaptiveAvgPool2d?

传统CNN经常:

Flatten
Fully Connected

例如:

7 × 7 × 512

Flatten:

25088

然后:

25088 → 4096

参数量巨大。

使用:

nn.AdaptiveAvgPool2d(1)

直接得到:

1 × 1 × 512

因此:

512 → Classes

参数大幅下降。


四十四、CNN中的Data Augmentation

训练图像模型时,数据增强非常重要。

常见:

Random Crop
Random Flip
Rotation
Color Jitter
Resize
Normalization

例如:

from torchvision import transforms

transform = transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
])

为什么有效?

因为我们希望模型学习:

Object

而不是:

Specific Pixel Arrangement

例如猫向左:

Cat →

和猫向右:

← Cat

应该属于同一类别。


四十五、CNN在目标检测中的应用

CNN不只是分类。

目标检测任务:

Image
CNN Backbone
Feature Maps
Detection Head
Bounding Boxes

例如:

┌──────────────────────┐
│                      │
│   ┌───────┐          │
│   │  Cat  │          │
│   └───────┘          │
│               ┌───┐  │
│               │Dog│  │
│               └───┘  │
└──────────────────────┘

经典模型:

R-CNN
Fast R-CNN
Faster R-CNN
YOLO
SSD
RetinaNet

很多经典检测模型都以CNN作为Backbone。


四十六、CNN在图像分割中的应用

语义分割:

Image
CNN Encoder
Feature
Decoder
Pixel-level Prediction

经典架构:

U-Net
FCN
DeepLab

最终输出:

每一个Pixel
Class

例如:

Pixel 1 → Road
Pixel 2 → Road
Pixel 3 → Car
Pixel 4 → Person

四十七、CNN与Transformer的关系

近年来:

CNN
ViT
Swin Transformer
Vision-Language Model
Multimodal LLM

Transformer在视觉领域快速发展。

但是不能简单认为:

CNN已经被Transformer淘汰。

二者解决问题的思路不同。


四十八、CNN vs Vision Transformer

CNN:

Local
Hierarchical
Global

Transformer:

Patch
Attention
Global Interaction

CNN天然具有:

Locality
Translation Equivariance
Parameter Sharing

Transformer更加擅长:

Long-range Dependency
Global Context
Flexible Attention

四十九、为什么Transformer需要大量数据?

CNN拥有比较强的Inductive Bias:

Locality
Spatial Structure
Translation Equivariance

也就是说CNN:

对图像结构已经有先验假设。

Transformer的先验更弱。

因此通常需要更多数据来学习:

什么是局部关系?
什么是空间关系?
什么是物体结构?

这也是CNN在数据规模有限的视觉任务中仍然具有价值的原因之一。


五十、现代CNN已经发生了什么变化?

现代CNN已经不再是简单:

Conv
Pool
Conv
Pool

而是逐渐演化为:

Residual
Depthwise Conv
Attention
Normalization
Large Kernel
Multi-scale
Feature Pyramid

代表架构包括:

ResNet
DenseNet
MobileNet
EfficientNet
ConvNeXt

其中ConvNeXt尤其值得关注。


五十一、ConvNeXt:现代CNN重新思考

ConvNeXt的思想之一是:

把Transformer时代的一些设计经验重新应用到CNN。

例如:

Large Kernel
LayerNorm
Depthwise Conv
Modern Training Recipe

这说明一个非常重要的事实:

CNN和Transformer并不是完全割裂的两套体系。

现代视觉模型正在不断融合两者的思想。


五十二、CNN真正的核心知识体系

如果把CNN压缩成一张知识地图:

CNN
├── Tensor
├── Convolution
│   ├── Kernel
│   ├── Filter
│   ├── Stride
│   ├── Padding
│   └── Dilation
├── Feature
│   ├── Edge
│   ├── Texture
│   ├── Shape
│   └── Semantic
├── Downsampling
│   ├── MaxPool
│   ├── AvgPool
│   └── Stride Conv
├── Nonlinearity
│   └── ReLU
├── Normalization
│   └── BatchNorm
├── Optimization
│   ├── Loss
│   ├── Backprop
│   └── Optimizer
├── Architecture
│   ├── LeNet
│   ├── AlexNet
│   ├── VGG
│   ├── ResNet
│   ├── MobileNet
│   └── ConvNeXt
└── Applications
    ├── Classification
    ├── Detection
    ├── Segmentation
    ├── OCR
    └── Video

五十三、作为AI Engineer,CNN应该学到什么程度?

如果目标是AI应用开发,不一定需要自己实现一个完整CNN训练框架。

但是以下内容必须理解:

第一层:必须掌握

Tensor
Conv
Kernel
Channel
Stride
Padding
Pooling
ReLU
Feature Map

第二层:深入理解

Forward
Backpropagation
Gradient
Loss
Optimizer
Receptive Field
BatchNorm
Residual

第三层:模型架构

LeNet
AlexNet
VGG
ResNet
MobileNet
EfficientNet
ConvNeXt

第四层:工程实践

PyTorch
CUDA
GPU
Mixed Precision
Data Augmentation
Distributed Training
Model Export
Inference

五十四、CNN最重要的本质

如果只记住CNN的几个核心思想,可以记住:

                 CNN
        ┌─────────┼─────────┐
        ↓         ↓         ↓
      Local    Sharing   Hierarchy
        │         │         │
        ↓         ↓         ↓
      局部      参数共享    层级特征
        │         │         │
        └─────────┼─────────┘
          Visual Representation
       Classification / Detection
       Segmentation / Recognition

CNN真正厉害的地方不是:

“用一个3×3的Kernel扫描图片。”

而是:

通过局部连接和参数共享,把原始像素逐层转换成越来越抽象的视觉表示。

最终:

Pixels
Edges
Textures
Shapes
Objects
Semantics

这就是CNN最核心的思想。


五十五、从CNN进一步理解现代AI

如果继续向现代AI发展,可以沿着下面的技术演化理解:

CNN
 ├── ResNet
 ├── Object Detection
 ├── Semantic Segmentation
 ├── Vision Transformer
 ├── CLIP
 ├── Vision-Language Model
 └── Multimodal LLM

最终会发现:

CNN
Computer Vision
Visual Representation
Multimodal Representation
Vision-Language Model
Multimodal Agent

所以学习CNN并不是学习一项“过时技术”,而是在学习:

现代视觉AI的基础计算思想。


结语

CNN经历了从LeNet、AlexNet、VGG到ResNet,再到MobileNet、EfficientNet和ConvNeXt的发展。

它解决的核心问题始终没有改变:

如何让神经网络高效地从空间结构数据中学习层级化特征。

从工程角度看,CNN最值得掌握的不是背诵网络结构,而是理解:

Input Tensor
Convolution
Feature Extraction
Non-linearity
Downsampling
Hierarchical Representation
Prediction
Loss
Backpropagation
Weight Update

一旦真正理解这条链路,后面学习:

ResNet
MobileNet
EfficientNet
ConvNeXt
ViT
Swin Transformer
CLIP
Vision-Language Model
Multimodal LLM

都会容易很多。

CNN不是计算机视觉的终点,而是理解现代视觉AI的一个重要起点。

Vincent zhai
Vincent zhai
Full-Stack Engineer