人工智能之核心技术 深度学习 第三章 卷积神经网络(CNN)

人工智能之核心技术 深度学习

第三章 卷积神经网络(CNN)


文章目录

  • [人工智能之核心技术 深度学习](#人工智能之核心技术 深度学习)
  • [前言:卷积神经网络(CNN)------ 计算机视觉核心](#前言:卷积神经网络(CNN)—— 计算机视觉核心)
    • [一、CNN 核心组件](#一、CNN 核心组件)
      • [1.1 卷积层(Convolutional Layer)](#1.1 卷积层(Convolutional Layer))
      • [1.2 池化层(Pooling Layer)](#1.2 池化层(Pooling Layer))
      • [1.3 全连接层(Fully Connected Layer)](#1.3 全连接层(Fully Connected Layer))
      • [1.4 卷积核设计原则](#1.4 卷积核设计原则)
    • [二、经典 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 核心组件

传统全连接网络处理图像存在两大问题:

  1. 参数爆炸 :一张 224×224 的 RGB 图像有 150,528 个像素,若第一层有 1000 个神经元,参数量高达 1.5 亿
  2. 忽略空间结构:全连接将像素视为无序向量,丢失了图像的局部相关性。

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》

相关推荐
阿杰学AI2 小时前
AI核心知识68——大语言模型之NSP (简洁且通俗易懂版)
人工智能·ai·语言模型·自然语言处理·aigc·nsp·下一状态预测
油泼辣子多加2 小时前
【信创】华为昇腾大模型部署
人工智能·算法·机器学习·华为
说私域2 小时前
分享经济视角下社会化众包与众筹的创新路径——链动2+1模式AI智能名片小程序的融合应用
人工智能·小程序·流量运营·私域运营
EricPan20232 小时前
PDF分析与处理笔记
人工智能
顾北122 小时前
用Spring AI赋能AI应用:多工具集成与旅游计划PDF生成实战
人工智能
老兵发新帖2 小时前
Label Studio的自动训练接口的对接实现
人工智能
moonshotcommons2 小时前
0G Al Vibe Coding Session|In 深圳
人工智能
暗之星瞳2 小时前
opencv进阶——掩膜的应用等
人工智能·opencv·计算机视觉
0泡2 小时前
GCN and Mamba的 理论相似性
深度学习