人工智能之核心技术 深度学习
第三章 卷积神经网络(CNN)
文章目录
- [人工智能之核心技术 深度学习](#人工智能之核心技术 深度学习)
- [前言:卷积神经网络(CNN)------ 计算机视觉核心](#前言:卷积神经网络(CNN)—— 计算机视觉核心)
- [一、CNN 核心组件](#一、CNN 核心组件)
- [二、经典 CNN 模型演进](#二、经典 CNN 模型演进)
- [2.1 LeNet-5(1998,Yann LeCun)](#2.1 LeNet-5(1998,Yann LeCun))
- [2.2 AlexNet(2012,ImageNet 冠军)](#2.2 AlexNet(2012,ImageNet 冠军))
- [2.3 VGG(2014)](#2.3 VGG(2014))
- [2.4 GoogLeNet / Inception(2014)](#2.4 GoogLeNet / Inception(2014))
- [2.5 ResNet(2015,里程碑)](#2.5 ResNet(2015,里程碑))
- [2.6 DenseNet(2017)](#2.6 DenseNet(2017))
- [三、CNN 应用场景](#三、CNN 应用场景)
- [3.1 图像分类(Image Classification)](#3.1 图像分类(Image Classification))
- [3.2 目标检测(Object Detection)入门](#3.2 目标检测(Object Detection)入门)
- [R-CNN 系列演进:](#R-CNN 系列演进:)
- 四、配套代码实现(PyTorch)
- [示例 1:构建简易 CNN(类似 LeNet)](#示例 1:构建简易 CNN(类似 LeNet))
- [示例 2:ResNet 基本残差块](#示例 2:ResNet 基本残差块)
- 五、总结与对比
- 资料关注
前言:卷积神经网络(CNN)------ 计算机视觉核心
卷积神经网络(Convolutional Neural Network, CNN)是深度学习在计算机视觉领域取得革命性成功的基石。它通过模拟人类视觉系统的局部感知和层次抽象机制,高效地从图像中提取特征。
一、CNN 核心组件
传统全连接网络处理图像存在两大问题:
- 参数爆炸 :一张 224×224 的 RGB 图像有 150,528 个像素,若第一层有 1000 个神经元,参数量高达 1.5 亿!
- 忽略空间结构:全连接将像素视为无序向量,丢失了图像的局部相关性。
CNN 通过以下三大核心组件解决这些问题:
1.1 卷积层(Convolutional Layer)
核心思想:
- 局部感受野(Local Receptive Field):每个神经元只关注输入图像的一小块区域(如 3×3)。
- 权值共享(Weight Sharing):同一个卷积核在整个图像上滑动,使用同一组权重 → 大幅减少参数!
关键超参数:
| 参数 | 说明 |
|---|---|
| 卷积核大小(Kernel Size) | 常见 3×3、5×5;小核堆叠可替代大核(VGG 思想) |
| 步幅(Stride) | 卷积核每次移动的像素数;Stride=2 可降采样 |
| 填充(Padding) | 在图像边缘补 0,控制输出尺寸: - padding = (kernel_size - 1)/2 → 输出尺寸不变("same" padding) |
输出尺寸公式:
H out = ⌊ H in + 2 P − K S ⌋ + 1 H_{\text{out}} = \left\lfloor \frac{H_{\text{in}} + 2P - K}{S} \right\rfloor + 1 Hout=⌊SHin+2P−K⌋+1
其中 K K K = 卷积核大小, P P P = padding, S S S = stride。
输入图像 5x5
3x3 卷积核
Stride=1, Padding=0
输出特征图 3x3
💡 为什么有效?
卷积操作天然捕捉边缘、纹理、形状 等局部模式,且具有平移不变性(物体在哪都能识别)。
1.2 池化层(Pooling Layer)
目的:降维 + 增强鲁棒性(对微小位移不敏感)
| 类型 | 操作 | 特点 |
|---|---|---|
| 最大池化(Max Pooling) | 取窗口内最大值 | 保留显著特征,常用 |
| 平均池化(Average Pooling) | 取窗口内平均值 | 平滑,较少用 |
- 典型设置:2×2 窗口,Stride=2 → 尺寸减半
- 无参数、不可学习
4x4 特征图
MaxPool 2x2, Stride=2
2x2 输出
1.3 全连接层(Fully Connected Layer)
- 位于 CNN 末端,将前面提取的高维特征映射到类别概率
- 输入需展平(Flatten)为一维向量
- 参数量大,是过拟合主要来源 → 常配合 Dropout 使用
1.4 卷积核设计原则
| 原则 | 说明 |
|---|---|
| 小卷积核堆叠优于大卷积核 | 两个 3×3 卷积 ≈ 一个 5×5 卷积,但参数少 28%,且非线性更强(VGG) |
| 1×1 卷积用于通道变换 | 不改变空间尺寸,但可升/降维(GoogLeNet) |
| 深度可分离卷积 | 先逐通道卷积,再 1×1 融合 → 极大减少计算量(MobileNet) |
二、经典 CNN 模型演进
2.1 LeNet-5(1998,Yann LeCun)
- 首个成功 CNN,用于手写数字识别(MNIST)
- 结构:
Conv → Pool → Conv → Pool → FC → FC - 使用 tanh 激活,平均池化
Input
Conv1
Pool1
Conv2
Pool2
Flatten
FC1
FC2
Output
📌 意义:证明了端到端学习图像特征的可行性。
2.2 AlexNet(2012,ImageNet 冠军)
- 引爆深度学习热潮
- 创新点:
- 使用 ReLU 激活(解决 Sigmoid 梯度消失)
- Dropout 防止过拟合
- GPU 加速训练
- 重叠池化(3×3 window, stride=2)
⚡ 参数量:6000 万,远超 LeNet
2.3 VGG(2014)
- 统一使用 3×3 小卷积核,深度达 16~19 层
- 发现:深度比宽度更重要
- 结构简洁,成为后续模型 backbone
python
# VGG 块示例
def vgg_block(num_convs, in_channels, out_channels):
layers = []
for _ in range(num_convs):
layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))
layers.append(nn.ReLU())
in_channels = out_channels
layers.append(nn.MaxPool2d(kernel_size=2, stride=2))
return nn.Sequential(*layers)
2.4 GoogLeNet / Inception(2014)
- 引入 Inception 模块:并行使用多种卷积核(1×1, 3×3, 5×5)+ 池化
- 1×1 卷积用于降维,控制计算量
- 引入 辅助分类器(中间层加 loss),缓解梯度消失
Input
1x1 Conv
1x1 Conv --> 3x3 Conv
1x1 Conv --> 5x5 Conv
3x3 MaxPool --> 1x1 Conv
Concat
Output
2.5 ResNet(2015,里程碑)
- 残差连接(Residual Connection) 解决深度网络退化问题
- 核心思想:学习 残差函数 F ( x ) = H ( x ) − x F(x) = H(x) - x F(x)=H(x)−x,而非直接拟合 H ( x ) H(x) H(x)
- 公式: y = F ( x ) + x y = F(x) + x y=F(x)+x
x
F(x): 两层卷积
Add
y
✅ 效果:训练 1000+ 层网络成为可能!ImageNet 错误率降至 3.6%
2.6 DenseNet(2017)
- 密集连接:每一层接收前面所有层的特征作为输入
- 公式: x l = H l ( [ x 0 , x 1 , . . . , x l − 1 ] ) x_l = H_l([x_0, x_1, ..., x_{l-1}]) xl=Hl([x0,x1,...,xl−1])
- 优点:特征重用、缓解梯度消失、参数更少
三、CNN 应用场景
3.1 图像分类(Image Classification)
- 任务:给整张图打标签(如 "猫"、"狗")
- 代表模型:ResNet, EfficientNet
- 评估指标:Top-1 / Top-5 Accuracy
3.2 目标检测(Object Detection)入门
目标检测 = 定位(Bounding Box) + 分类
R-CNN 系列演进:
| 模型 | 核心思想 | 缺点 |
|---|---|---|
| R-CNN | 先用 Selective Search 提候选框,再 CNN 分类 | 速度慢(每图 2000 次前向) |
| Fast R-CNN | 共享卷积特征,RoI Pooling 提取固定尺寸 | 仍依赖外部候选框生成 |
| Faster R-CNN | 引入 RPN(Region Proposal Network),端到端训练 | 实时性仍不足 |
| YOLO / SSD | 单阶段检测:直接回归框 + 类别 | 速度快,适合实时应用 |
🔍 关键组件:
- RoI Pooling / RoI Align:将不同尺寸区域映射为固定大小特征
- Anchor Boxes:预设多尺度框,提升召回率
四、配套代码实现(PyTorch)
示例 1:构建简易 CNN(类似 LeNet)
python
import torch
import torch.nn as nn
class SimpleCNN(nn.Module):
def __init__(self, num_classes=10):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 32, kernel_size=5, padding=2), # 32x32x3 → 32x32x32
nn.ReLU(),
nn.MaxPool2d(2), # → 16x16x32
nn.Conv2d(32, 64, kernel_size=5, padding=2), # → 16x16x64
nn.ReLU(),
nn.MaxPool2d(2), # → 8x8x64
)
self.classifier = nn.Sequential(
nn.Flatten(),
nn.Linear(8 * 8 * 64, 256),
nn.ReLU(),
nn.Dropout(0.5),
nn.Linear(256, num_classes)
)
def forward(self, x):
x = self.features(x)
x = self.classifier(x)
return x
# 测试
model = SimpleCNN()
x = torch.randn(1, 3, 32, 32)
print(model(x).shape) # torch.Size([1, 10])
示例 2:ResNet 基本残差块
python
class BasicBlock(nn.Module):
def __init__(self, in_channels, out_channels, stride=1, downsample=None):
super().__init__()
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3,
stride=stride, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(out_channels)
self.relu = nn.ReLU(inplace=True)
self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3,
padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(out_channels)
self.downsample = downsample # 用于维度匹配
def forward(self, x):
identity = x
out = self.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
if self.downsample is not None:
identity = self.downsample(x)
out += identity
return self.relu(out)
五、总结与对比
| 模型 | 创新点 | 深度 | 关键技术 |
|---|---|---|---|
| LeNet-5 | 首个 CNN | 5 层 | 卷积 + 池化 |
| AlexNet | ReLU + Dropout | 8 层 | GPU 训练 |
| VGG | 小卷积核堆叠 | 16~19 层 | 3×3 卷积 |
| GoogLeNet | Inception 模块 | 22 层 | 多尺度并行 |
| ResNet | 残差连接 | 18~152+ 层 | 跳跃连接 |
| DenseNet | 密集连接 | 121~201 层 | 特征复用 |
✅ 现代实践建议:
- 图像分类:ResNet-50 / EfficientNet-B0
- 移动端:MobileNetV3 / ShuffleNet
- 目标检测:YOLOv8 / DETR
资料关注
公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》