一、从"人设计特征"到"机器学特征"
"小陈,上一章我们讲到 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 训练一个图像分类模型,实现王姐要的'拍照搜书'。咱们不从头造轮子,用迁移学习(用预训练模型微调),这是工程上最快最稳的路。"