诈骗克星——视频换脸检测模块开发(五)
·
诈骗克星——视频换脸检测模块开发(五)
📋 本周概述
本周是项目开发的第五周,核心工作是对抗过拟合的专项训练。在吸取第二轮微调失败的教训后,针对性地从三个方面对训练流程进行了优化:强化数据增强、添加 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%
总结
本周关键成果
- 验证准确率达 85.00%——三轮训练最高
- 过拟合得到控制——训练集准确率从 97.76% 被压制到 97.00%
- 三大正则化手段落地——Dropout + 强增强 + 权重衰减
- 验证集稳定性提升——波动明显减小
本周心得
训练不是次数越多越好,而是手段越对越好。
第二轮盲目多训练 6 个 epoch,准确率不升反降。
第三轮用正则化手段,准确率提升了 0.59 个百分点。解决正确的问题,比解决更多的问题更重要。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)