诈骗克星——视频换脸检测模块开发(五)

📋 本周概述

本周是项目开发的第五周,核心工作是对抗过拟合的专项训练。在吸取第二轮微调失败的教训后,针对性地从三个方面对训练流程进行了优化:强化数据增强添加 Dropout 正则化增大权重衰减。第三轮训练验证准确率达到 85.00%,过拟合程度明显改善,模型泛化能力得到有效提升。


本周核心成果

1. 三大优化部署

1.1 数据增强:从"几乎无增强"到"强增强"

旧版(第二轮)

transforms.Compose([
    transforms.Resize((320, 320)),
    transforms.RandomCrop((299, 299)),
    transforms.RandomHorizontalFlip(p=0.5),
    # transforms.ColorJitter(...),  ← 注释
    transforms.ToTensor(),
])

新版(第三轮)

transforms.Compose([
    transforms.Resize((320, 320)),
    transforms.RandomCrop((299, 299)),
    transforms.RandomHorizontalFlip(p=0.5),
    transforms.ColorJitter(brightness=0.3, contrast=0.3, saturation=0.3, hue=0.1),
    transforms.RandomRotation(10),
    transforms.RandomAffine(degrees=0, translate=(0.1, 0.1)),
    transforms.ToTensor(),
])

效果分析

  • 每一轮训练,模型看到的图片都不一样(颜色、角度、位置随机变化)
  • 模型无法通过"死记硬背"来拟合训练集
  • 有效抑制过拟合
1.2 模型结构:新增 Dropout 层

旧版

self.fc = nn.Linear(2048, num_classes)  # 直接全连接,无正则化

新版

self.dropout = nn.Dropout(0.5)          # 随机丢弃 50% 神经元
self.fc = nn.Linear(2048, num_classes)

以及 forward 中:

def forward(self, x):
    x = self.features(x)
    x = self.logits(x)
    x = self.dropout(x)     # ← 新增:训练时随机失活
    x = self.classifier(x)
    return x

效果分析

  • 训练时每次前向传播随机丢弃 50% 神经元
  • 相当于训练了多个不同子网络的集成
  • 推理时所有神经元参与,综合决策
1.3 训练参数:增大权重衰减
# 第二轮:默认 weight_decay=1e-5(很小的正则化)
# 第三轮:weight_decay=1e-4(10 倍正则化强度)

2. 第三轮训练完整记录

2.1 训练配置
python train.py --data_dir data \
                --resume checkpoints/best_model.pth \
                --batch_size 32 \
                --num_epochs 15 \
                --lr 0.00005 \
                --weight_decay 1e-4

关键参数

参数 第二轮(失败) 第三轮(本次) 变化
学习率 0.0001 0.00005 减半
批次大小 32 32 不变
权重衰减 1e-5 1e-4 10 倍
ColorJitter ❌ 注释 ✅ 启用 新增
RandomRotation ✅ 10° 新增
RandomAffine ✅ 10% 平移 新增
Dropout ✅ 0.5 新增
2.2 完整训练数据
Epoch Train Loss Train Acc Val Loss Val Acc 模型保存
7/15 0.1784 93.08% 0.6559 78.50% -
8/15 0.1362 94.78% 0.5186 81.76% -
9/15 0.1198 95.48% 0.5127 83.69% -
10/15 0.1075 96.03% 0.5084 84.27% -
11/15 0.0976 96.43% 0.5192 84.85%
12/15 0.0901 96.74% 0.6094 84.98%
13/15 0.0835 97.00% 0.5368 85.00% 最佳
14/15 0.0785 97.13% 0.5440 84.42% -
15/15 0.0748 97.30% 0.6045 83.50% -

关键指标

  • 最佳验证准确率85.00%(Epoch 13)
  • 训练损失:持续下降 0.1784 → 0.0748
  • 验证准确率:稳步回升 78.50% → 85.00%
  • Epoch 14 异常:训练耗时 9 小时 20 分钟(正常约 26 分钟)

三轮训练全面对比

3.1 核心指标对比

指标 第一轮 第二轮(微调) 第三轮(防过拟合)
最优验证准确率 80.98% 84.41% 85.00%
训练集准确率 ~89% 97.76% 97.00%
过拟合差距 ~8% 13.35% 12.00%
训练集损失 较高 0.0616 0.0835
验证集损失 较低 0.5938 0.5368
验证集稳定性 稳定 波动大 较稳定
训练策略 基础训练 小学习率微调 强正则化训练
数据增强
Dropout 0.5
权重衰减 1e-5 1e-5 1e-4

3.2 准确率演进曲线

验证准确率演进:
     |
 86% |
 85% |                                        ● (85.00%) ← 第三轮最佳
     |                              ● (84.98%)
 84% |                    ● (84.27%)     ● (84.42%)
     |               ● (83.69%)
 83% |          ● (81.76%)
     |     ● (78.50%)
 82% |
     |
 81% |● (80.98%) ← 第一轮
     |
     +----+----+----+----+----+----+----+----+----→ Epoch
         R1    7    8    9   10   11   12   13   14   15
                                     第三轮

训练准确率演进:
     |
 98% |    第二轮(97.76%)        第三轮
     |                              ● (97.30%)
 97% |                         ● (97.00%)
     |                    ● (96.74%)
 96% |               ● (96.03%)
     |          ● (95.48%)
 95% |     ● (94.78%)
     |
 94% |● (93.08%)
     |
 93% |
     +----+----+----+----+----+----+----+----+----→ Epoch
         7    8    9   10   11   12   13   14   15

3.3 过拟合程度对比

过拟合差距(训练准确率 - 验证准确率):

第一轮:89% - 81% = ~8%  ████████░░░░░░░░░░░░  轻微
第二轮:98% - 84% = 14%  ██████████████░░░░░░  严重过拟合
第三轮:97% - 85% = 12%  ████████████░░░░░░░░  有所改善

关键变化:
- 第二轮训练集飙升到 97.76%,验证集反而下降
- 第三轮训练集被压制在 97.00%,验证集稳步提升到 85.00%

深度分析

4.1 为什么前几个 Epoch 准确率偏低?

原因分析:
1. Dropout(0.5) 刚加入:模型每次随机丢弃 50% 神经元
   → 训练时"一半大脑"在工作,验证时"全脑"不习惯
   
2. 强数据增强:图片颜色、角度、位置随机变化
   → 模型需要重新学习"什么才是真实特征"
   
3. 小学习率:lr=0.00005,调整速度慢
   → 需要更多步数才能适应新环境

适应过程:
Epoch 7:  78.50% → "还在适应新环境"
Epoch 8:  81.76% → "开始找到感觉"
Epoch 9:  83.69% → "逐渐稳定"
Epoch 10: 84.27% → "超过第二轮基准"
Epoch 13: 85.00% → "创新高!"

这种"先低后高"的模式恰恰说明正则化在起作用——模型不再走"死记硬背"的捷径,而是被迫学习真正的泛化特征。

4.2 Dropout 的工作原理

训练时(Dropout 生效):
    输入特征:[0.5, 0.8, 0.3, 0.6, 0.9, 0.2]
    随机掩码:[ 1 ,  0 ,  1 ,  0 ,  1 ,  1 ]  ← 50% 神经元失活
    实际输入:[0.5, 0.0, 0.3, 0.0, 0.9, 0.2]
    
    → 模型必须学会:即使"一半神经元"被关闭,也要正确分类
    → 每个神经元必须独立有用,不能依赖"搭档"

推理时(Dropout 关闭):
    输入特征:[0.5, 0.8, 0.3, 0.6, 0.9, 0.2]  ← 全量输入
    → 所有神经元协同工作
    → 效果 ≈ 多个子模型的集成决策

4.3 数据增强的实际效果

同一张图片,模型每次看到都不同:

原始图片:[人脸正面,正常亮度,无旋转]
     ↓ RandomHorizontalFlip(0.5)
可能翻转:[人脸朝左 或 朝右]
     ↓ ColorJitter(0.3, 0.3, 0.3, 0.1)
颜色变化:[偏红/偏蓝/偏亮/偏暗/饱和度变化]
     ↓ RandomRotation(10)
角度变化:[顺时针最多 10° 或 逆时针最多 10°]
     ↓ RandomAffine(translate=(0.1, 0.1))
位置偏移:[左右/上下最多平移 10%]
     ↓
最终图片:与原图显著不同,但语义不变

效果:16 万张图片 × 每次随机变化 ≈ 无限多样性

关键技术

5.1 过拟合:从"看不见"到"看得见"到"管得住"

第一轮

  • 过拟合差距 ~8%,不算严重,但验证准确率只有 81%
  • 此时的主要矛盾是欠拟合,需要更多训练

第二轮

  • 过拟合差距飙升至 13.35%,训练集几乎完美但验证集不升反降
  • 此时的主要矛盾变成过拟合,继续训练只会更糟

第三轮

  • 过拟合差距缩小到 12%,验证准确率提升到 85%
  • 正确策略:不是"训练更多",而是"训练得更聪明"

5.2 为什么正则化有效?

第二轮(无反制措施):
   模型:"这 16 万张图我都记住"
   验证集:"但这些新图你没见过"
   → 过拟合

第三轮(三板斧反制):
   Dropout:  "神经元们,轮流休息!别抱团!"
   数据增强:"每张图都变个样,别想记住!"
   权重衰减:"权重别太大,保持简单!"
   → 模型被迫学习真实特征,而非背答案

项目整体进度

阶段 状态 说明
技术调研 ✅ 100% XceptionNet 方案确定
项目搭建 ✅ 100% 完整工程结构
模型实现 ✅ 100% XceptionNet + Dropout
数据准备 ✅ 100% WildDeepfake 16万张
数据增强 ✅ 100% 强增强策略
第一轮训练 ✅ 100% 80.98%
第二轮训练 ✅ 100% 84.41%(过拟合)
第三轮训练 ✅ 100% 85.00%(正则化)
API 服务 ⏳ 80% 代码就绪,待测试
模型评估 ⏳ 0% 待进行
大模型联调 ⏳ 0% 待开始
项目交付 ⏳ 0% 待进行

总体进度:约 88%


总结

本周关键成果

  1. 验证准确率达 85.00%——三轮训练最高
  2. 过拟合得到控制——训练集准确率从 97.76% 被压制到 97.00%
  3. 三大正则化手段落地——Dropout + 强增强 + 权重衰减
  4. 验证集稳定性提升——波动明显减小

本周心得

训练不是次数越多越好,而是手段越对越好。

第二轮盲目多训练 6 个 epoch,准确率不升反降。
第三轮用正则化手段,准确率提升了 0.59 个百分点。

解决正确的问题,比解决更多的问题更重要。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐