第六章

深度学习与 CNN:机器自己学“看什么”

第五层 · 卷积/池化/训练 神经网络是怎么“看”图的

一、从"人设计特征"到"机器学特征"

"小陈,上一章我们讲到 HOG+SVM 的局限:特征要人设计。"老周说,"深度学习革命性地解决了这个问题——让网络自己从数据里学出特征。"

神经网络(Neural Network):
  灵感来自大脑神经元,但本质是"数学函数"

  一个神经元:
    输入 x1, x2, x3
      × 权重 w1, w2, w3
      相加 + 偏置 b
      过激活函数 → 输出

    output = activation(w1*x1 + w2*x2 + w3*x3 + b)

  神经网络 = 很多神经元分层连接:
    输入层 → 隐藏层 → 隐藏层 → 输出层
    每层学到的"特征"越来越抽象:
      第1层:边缘、颜色块
      第2层:纹理、形状部件
      第3层:局部结构(眼睛、轮子)
      深层:完整语义(脸、汽车、书)

  训练 = 不断调整权重 w,让输出接近正确答案
    (给猫的图 → 输出"猫";给狗的图 → 输出"狗")

"神经网络就是'一个超大的可调参数的函数'——训练的过程,就是'调参数'让这个函数在数据上表现越来越好的过程。'学习'='调参'。"


二、CNN 为什么适合图像:卷积层

"普通神经网络处理图像有个问题:图像像素太多(百万级),全连接会爆炸。CNN(卷积神经网络)用'卷积'解决。"老周说:

卷积(Convolution)——图像特征提取的核心操作:
  一个"小滤波器"(卷积核,如 3×3)滑过整张图
  每个位置做"加权求和" → 输出特征图

  例:边缘检测卷积核
  ┌─────────┐
  │ -1  0  1 │    这个核滑过图 → 找出"竖直边缘"
  │ -1  0  1 │
  │ -1  0  1 │
  └─────────┘

  卷积在干什么?
    每个卷积核 = 一种"特征检测器"
      - 边缘核:检测边缘
      - 纹理核:检测纹理
      - 颜色核:检测色块
    一层卷积 = 用多个核检测多种特征
    → 输出多张"特征图"

  卷积层特点(为什么适合图像):
    ① 局部连接:只看一小块邻域(符合图像局部性)
    ② 权重共享:同一个核滑遍全图(参数少,省内存)
    ③ 平移不变:猫在左边还是右边,都能检测到

"卷积 = '特征探测器滑动扫描'——每个卷积核探测一种特征。这是 CNN 理解图像的第一步:先找边缘、纹理这些'零件'。"


三、池化层与激活函数:压缩与非线性

"卷积之后还有两个标配:池化(Pooling)和激活函数(Activation)。"老周说:

池化(Pooling)—— 压缩特征图:
  把一小块区域"浓缩"成一个值
  最大池化(Max Pooling):取最大值(最常用)
  ┌────┬────┐        ┌────┐
  │ 1  │ 5  │  2×2   │ 5  │  ← 取最大
  ├────┼────┤  →     ├────┤
  │ 3  │ 2  │        │ 7  │
  └────┴────┘        └────┘
  │ 6  │ 7  │
  作用:降维(尺寸减半)、保留显著特征、减少计算量
  还带来:一定程度的位置不变性

激活函数(Activation)—— 引入非线性:
  没有激活函数,多层网络 = 一层(线性)
  常见:ReLU(整流线性单元,最常用)
    ReLU(x) = max(0, x)
    负值变 0,正值保留 → 简单、快、缓解梯度消失
  其他:Sigmoid(0-1 输出)、Tanh(-1 到 1)

"CNN 标配三层:卷积(提特征)→ 激活(加非线性)→ 池化(压缩)。 三件套反复堆叠,特征越来越抽象,网络越来越'懂'图。"


四、CNN 的整体结构:从像素到类别

老周画出经典 CNN 结构(类似 LeNet/AlexNet 的简化):

CNN 图像分类结构:
  ┌──────────┐   ┌──────────┐   ┌──────────┐
  │ 输入图像  │ → │ 卷积层+池化 │ → │ 卷积层+池化 │ → ...
  │ 32×32×3  │   │ 特征图×N  │   │ 特征图×M  │
  └──────────┘   └──────────┘   └──────────┘
      (自动学特征:边缘→纹理→部件→语义)
                       │
                       ▼
  ┌──────────┐   ┌──────────┐   ┌──────────┐
  │ 展平 Flatten │ → │ 全连接层  │ → │ 输出 Softmax│
  │ 特征变一维  │   │ 分类判断   │   │ 各类概率    │
  └──────────┘   └──────────┘   └──────────┘
                         输出: [0.02, 0.91, 0.07]
                         类别概率(科幻91%)

  数据流:
    图片(像素矩阵)
    → 卷积/池化堆叠(学到特征图)
    → 展平(特征向量)
    → 全连接(分类)
    → Softmax(各类概率)
    → 取概率最大的类 = 预测结果

  关键:前面卷积层=特征提取(自动)
        后面全连接层=分类判断

"CNN = '自动特征提取器 + 分类器'的合体——之前 HOG+SVM 分两步走,CNN 端到端一步搞定:喂图,出类别。"


五、训练:反向传播与梯度下降

"网络结构搭好了,怎么'训练'?两个核心机制。"老周说:

训练两个核心:
  ① 损失函数(Loss):
     衡量"预测和正确答案差多少"
     分类常用:交叉熵损失
     预测越准,损失越小 → 目标:让损失最小

  ② 反向传播(Backpropagation):
     从输出往回,计算每个权重对损失的"影响"
     → 知道"该往哪个方向调、调多少"

  ③ 梯度下降(Gradient Descent):
     按梯度方向更新权重:w = w - lr × 梯度
     lr(学习率):每次调整的步长
     反复迭代 → 损失下降 → 网络学得越来越好

  训练过程:
    前向传播(算预测)→ 算损失
    → 反向传播(算梯度)→ 更新权重
    → 重复成千上万次(一个 epoch = 过一遍数据)

  训练 vs 推理:
    训练:调权重(慢,用 GPU)
    推理:用训练好的权重预测(快,部署用)

"训练 = 反复'猜-错-改'——前向传播猜答案,反向传播算怎么改,梯度下降动手改。'深度学习'的'深',就是层数多、参数多、能学到的特征更抽象。"


六、过拟合与泛化:训练的最大敌人

"训练里最大的坑:过拟合(Overfitting)。"老周强调:

过拟合(Overfitting):
  模型把"训练数据"背下来了,却没学会"规律"
  表现:训练集准确率 99%,测试集只有 60%

  比喻:考试前把练习题答案背下来
        换一道新题就不会了

  解决过拟合的常见方法:
    ① 更多数据(最有效)
    ② 数据增强(Data Augmentation):训练时随机
       旋转/翻转/裁剪/变色 → 变出"更多样"的数据
    ③ 正则化(Dropout):随机丢一部分神经元
       → 网络不能依赖某个神经元 → 学得更稳健
    ④ 早停(Early Stopping):验证集不再提升就停

  评估的正确姿势:
    训练集/验证集/测试集要分开!
    用测试集评估 = 模拟"真实新数据"
    绝不能用测试集调参(作弊!)

  sklearn 的 train_test_split、cross-validation
  深度学习:手动划分或 torch 的 Dataset 划分

"过拟合是深度学习最常见的坑——'训练好≠能用'。看模型好坏,永远看'没见过的数据'(测试集)上的表现。"


七、章末:老周的第六章总结

第五层:深度学习与 CNN
├── 神经网络:可调参的函数(权重+激活)
├── 卷积层:特征探测器(边缘/纹理,滑动扫描)
│   局部连接 + 权重共享 + 平移不变
├── 池化层:压缩特征图(最大池化)
├── 激活函数:ReLU(非线性)
├── CNN 结构:卷积池化堆叠(学特征)→ 全连接(分类)
├── 训练:损失函数 + 反向传播 + 梯度下降
├── 训练 vs 推理:调权 vs 预测
└── 过拟合:训练好≠能用(数据增强/Dropout/早停)
第七层(预告):图像分类实战 —— 拍照识别书封

"小陈,CNN 的原理你懂了:自动学特征、端到端分类。"老周说,"下一章是实战——用 PyTorch 训练一个图像分类模型,实现王姐要的'拍照搜书'。咱们不从头造轮子,用迁移学习(用预训练模型微调),这是工程上最快最稳的路。"

✌ 语言