一、CNN 的核心:为何能 “看懂” 图像?
CNN 的设计灵感源于人类视觉系统 —— 我们先感知边缘、纹理等局部信息,再逐步组合成 “物体” 的整体认知。这一过程依赖图像的两大关键特性:
1.1 图像的两大核心特性
- 不变性:物体在图像中位置移动(平移不变性)、尺度缩放或轻微旋转(尺度 / 旋转不变性)时,模型仍能准确识别。核心实现:卷积核滑动覆盖全图 + 池化层的聚合作用,降低局部特征的位置敏感度。
- 局部感知:每个神经元仅关注输入图像的局部区域(称为 “感受野”),通过小尺寸卷积核提取边缘、角点、纹理等基础特征,再通过深层网络组合成高层语义特征(如 “眼睛”“车轮”)。
1.2 图像在 CNN 中的表示
在深度学习框架(如 PyTorch、TensorFlow)中,图像通常以4 维张量形式输入,维度顺序为 [N, C, H, W](部分框架为 [N, H, W, C],需注意适配):
- N(Batch Size):一次输入的图像样本数量(如一次训练 16 张图,N=16);
- C(Channels):图像通道数(灰度图 C=1,RGB 彩色图 C=3,特征图通道数由卷积核个数决定);
- H(Height):图像高度(垂直方向像素数,如 224×224 的图像 H=224);
- W(Width):图像宽度(水平方向像素数,同上 W=224)。
二、CNN 的核心组件拆解
一个典型的 CNN 由 “卷积层→激活函数→池化层” 的重复模块,搭配最后的全连接层(或全局池化层)构成,各组件分工明确。
2.1 卷积层:提取图像特征的 “核心工具”
卷积层通过 “卷积核(滤波器)” 与输入图像进行加权和计算,实现局部特征提取,是 CNN 的 “灵魂”。
(1)卷积计算原理
卷积核(维度 [K, K, C_in],K 为核大小,C_in 为输入通道数)在输入特征图上滑动,与对应局部区域(大小 [K, K, C_in])逐元素相乘后求和,再加上偏置项,得到输出特征图的一个像素值。公式如下:output(i,j)=∑m=0K−1∑n=0K−1∑c=0Cin−1kernel(m,n,c)×input(i+m,j+n,c)+b
(2)输出特征图的两大变化规律
- 大小变化:由卷积核大小(K)、步长(s,滑动步幅)、填充(P,边缘补 0 层数)决定,公式为:Hout=⌊sHin+2P−K⌋+1Wout=⌊sWin+2P−K⌋+1常见场景:
Same Padding(P=(K-1)/2,K 为奇数):输出大小与输入一致;Valid Padding(P=0):输出大小小于输入。
- 通道变化:输出通道数(C_out)等于卷积核的个数。每个卷积核对应一个输出通道,C_out 个核则输出 C_out 个通道的特征图。
(3)参数量计算
每个卷积核的参数量为 K×K×C_in + 1(+1 为偏置项),总参数量为 C_out × (K×K×C_in + 1),体现了 CNN “权值共享” 的高效性(同一卷积核在全图复用)。
2.2 池化层:降维减参的 “优化工具”
池化层不参与特征提取,仅对卷积层输出的特征图进行局部聚合,核心作用是 “降维” 和 “增强鲁棒性”。
(1)两大常见池化类型
| 类型 | 计算方式 | 核心特点 |
|---|---|---|
| 最大池化(Max Pooling) | 取局部区域(如 2×2)的最大值 | 保留局部显著特征(如边缘强度),对噪声更鲁棒,应用最广 |
| 平均池化(Average Pooling) | 取局部区域的平均值 | 保留区域整体信息,常用于网络末尾的特征聚合 |
(2)计算规则
通常使用 2×2 的池化核、步长 2(s=K),此时输出特征图的 H 和 W 会减半,参数量和计算量随之降低,同时增强平移不变性。
2.3 CNN 的典型结构与代码实现
一个基础 CNN 的结构流程为:输入层 → 卷积层(+ReLU 激活)→ 池化层 → (重复卷积 + 池化)→ 全连接层 → 输出层
代码示例(PyTorch)
python
运行
import torch
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self, num_classes=10): # 10分类任务(如MNIST)
super(SimpleCNN, self).__init__()
# 卷积块1:输入1通道(灰度图)→ 输出16通道,3×3卷积+Same Padding
self.conv1 = nn.Conv2d(1, 16, kernel_size=3, stride=1, padding=1)
self.relu1 = nn.ReLU() # 激活函数,引入非线性
self.pool1 = nn.MaxPool2d(2, 2) # 2×2池化,输出尺寸减半
# 卷积块2:输入16通道→输出32通道
self.conv2 = nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1)
self.relu2 = nn.ReLU()
self.pool2 = nn.MaxPool2d(2, 2)
# 全连接层:输入=32×7×7(28×28图像经两次池化后尺寸)
self.fc = nn.Linear(32 * 7 * 7, num_classes)
def forward(self, x):
# 前向传播:conv→relu→pool
x = self.pool1(self.relu1(self.conv1(x))) # [N,1,28,28]→[N,16,14,14]
x = self.pool2(self.relu2(self.conv2(x))) # →[N,32,7,7]
x = x.view(x.size(0), -1) # 展平特征图:[N, 32×7×7]
x = self.fc(x) # →[N, num_classes]
return x
# 测试模型
model = SimpleCNN()
input_tensor = torch.randn(16, 1, 28, 28) # 16个28×28的灰度图
output = model(input_tensor)
print("输出形状:", output.shape) # 输出:torch.Size([16, 10])
三、现代经典 CNN 模型演进
CNN 的发展历程,是 “提升性能” 与 “降低成本” 的平衡史。以下是 6 个里程碑式的经典模型,其设计思路至今影响深远:
3.1 LeNet-5(1998):CNN 的 “开山鼻祖”
- 作者:Yann LeCun
- 核心任务:手写数字识别(MNIST)
- 结构:2 卷积层(5×5 核)+ 2 池化层 + 2 全连接层
- 意义:首次验证 “局部感知 + 权值共享” 的有效性,奠定 CNN 的基础范式。
3.2 AlexNet(2012):深度学习的 “复兴者”
- 作者:Alex Krizhevsky
- 核心突破:在 ImageNet 竞赛中准确率远超传统方法,推动深度学习爆发
- 关键设计:
- 8 层网络(5 卷积 + 3 全连接),首次使用 ReLU 激活函数(解决 sigmoid 梯度消失问题);
- 引入 Dropout(防止过拟合)和数据增强;
- 首次用 GPU 加速训练,支持大规模网络。
3.3 VGGNet(2014):“小核堆叠” 的极致
- 作者:Simonyan & Zisserman
- 核心设计:用 “3×3 小卷积核 + 多层堆叠” 替代大核(如 7×7),在减少参数量的同时增加非线性表达能力。
- 典型结构:VGG16(13 卷积层 + 3 全连接层),统一用 3×3 卷积和 2×2 池化,结构简洁。
- 缺点:参数量大(约 138M),计算成本高。
3.4 GoogLeNet(2014):“多尺度融合” 的创新
- 核心设计:引入Inception 模块—— 在同一层并行使用 1×1、3×3、5×5 卷积和 3×3 池化,同时融合多尺度特征;用 1×1 卷积 “降维”,大幅降低计算量。
- 亮点:取消全连接层,用全局平均池化替代,参数量仅 5M(远小于 VGG)。
3.5 ResNet(2015):“超深网络” 的突破
- 作者:何凯明团队
- 核心问题:解决深层网络的 “梯度消失 / 爆炸” 和 “退化问题”(网络变深,性能反而下降)。
- 关键创新:残差连接(Residual Connection),公式为
y = F(x) + x(F (x) 为卷积层输出的 “残差”,x 为输入的 “捷径连接”),使超深网络(如 ResNet-50/101/152)可训练。
3.6 MobileNet(2017):“移动端友好” 的轻量模型
- 核心目标:适配移动端、嵌入式设备(低算力、低内存)。
- 关键设计:深度可分离卷积—— 将标准卷积拆分为 “深度卷积”(每个通道单独卷积)和 “逐点卷积”(1×1 卷积融合通道),参数量和计算量仅为标准卷积的 1/8~1/9。
四、总结
CNN 的核心优势在于对图像局部特征的高效提取,从 LeNet-5 的基础范式,到 ResNet 的残差连接、MobileNet 的轻量化设计,其演进始终围绕 “更高效、更轻量、更鲁棒” 的目标。掌握这些基础原理和经典模型,是深入计算机视觉领域的关键第一步。
2万+

被折叠的 条评论
为什么被折叠?



