DAY49 预训练模型

目录

[1. 预训练的概念 (Concept of Pre-training)](#1. 预训练的概念 (Concept of Pre-training))

[2. 常见的分类预训练模型 (Common Models)](#2. 常见的分类预训练模型 (Common Models))

[3. 图像预训练模型的发展史 (Evolution History)](#3. 图像预训练模型的发展史 (Evolution History))

[4. 预训练的策略 (Pre-training Strategies)](#4. 预训练的策略 (Pre-training Strategies))

[5. 代码实战:ResNet18 适配 CIFAR-10](#5. 代码实战:ResNet18 适配 CIFAR-10)



1. 预训练的概念 (Concept of Pre-training)

  • 核心定义 :预训练是指利用在类似任务或大规模数据集上训练好的模型参数来初始化自己的模型,而不是从零开始(随机初始化)。这种思想被称为迁移学习

  • 解决的问题

    1. 收敛速度:好的初始值能大幅减少训练轮数。

    2. 避免局部最优:防止模型在训练初期陷入较差的局部最优解。

  • 任务划分 :预训练的过程称为上游任务 ,而在特定数据集上调整参数的过程称为微调(Fine-tuning)下游任务

  • 数据要求:通常要求在大规模数据集(如 ImageNet)上训练,因为只有海量数据才能支撑模型学习到通用的视觉特征。

2. 常见的分类预训练模型 (Common Models)

根据 notebook 的整理,主流预训练模型分为三类:

  • CNN架构

    • VGGNet:结构简洁,由纯卷积堆叠而成,参数量巨大。

    • ResNet:引入残差连接解决深度网络中的梯度消失问题,是目前最常用的基准模型。

    • MobileNet:轻量级设计,采用深度可分离卷积,适合移动端部署。

    • EfficientNet:通过复合缩放自动寻找最优配置,准确率领先。

  • Transformer类 :如 ViTSwin Transformer,在处理大尺寸图像时表现优异,通常需要对图像进行上采样或调整 Patch 大小。

  • 自监督模型 :如 MoCo v3BEiT,无需人工标注,适合数据稀缺的场景。

3. 图像预训练模型的发展史 (Evolution History)

  • 早期探索(1990s) :以 LeNet-5 为代表,验证了 CNN 的可行性。

  • 深度学习复兴(2012-2015)AlexNet 开启了 GPU 训练时代;VGG 加深了网络;GoogLeNet 引入了 Inception 多分支结构。

  • 超深网络时代(2015年后)ResNet 解决了网络退化问题,使层数突破 100 层;后续模型转向效率优化 (MobileNet)、特征复用 (DenseNet)和自动化设计(EfficientNet)。

4. 预训练的策略 (Pre-training Strategies)

实现迁移学习通常需要遵循以下三个要点:

  1. 加载模型与权重:直接复用固定的模型结构及其训练好的参数。

  2. 适配输入与输出

    • Resize:调整图像尺寸以适配模型要求。

    • 修改 Head:将最后的全连接层(FC)修改为符合下游任务类别数(如 CIFAR-10 的 10 类)。

  3. 阶段式训练

    • 冻结阶段 :初期先锁住 Backbone(骨干网络),只训练新修改的 Head,防止随机初始化的权重破坏预训练的特征提取能力。

    • 解冻阶段:训练 5-10 个 epoch 后解冻所有层,进行全局微调。

5. 代码实战:ResNet18 适配 CIFAR-10

Notebook 通过 PyTorch 展示了完整的实战流程:

  • 模型构建 :使用 models.resnet18(pretrained=True) 加载权重,并将 model.fc 修改为输出 10 维。

  • 冻结控制 :通过遍历 model.named_parameters(),将除 'fc' 层外的参数 requires_grad 设为 False

  • 训练调度 :定义了 train_with_freeze_schedule 函数,实现在 freeze_epochs 之后自动解冻参数并降低学习率进行精细调优。

  • 最终效果 :通过预训练模型,在 CIFAR-10 上仅微调 40 轮即可达到约 86.30% 的准确率,显著优于非预训练模型。


相关推荐
清水白石00816 小时前
深入 Python 的底层世界:从 C 扩展到 ctypes 与 Cython 的本质差异全解析
c语言·python·neo4j
Amelia11111116 小时前
day49
python
IT=>小脑虎17 小时前
2026版 Python零基础小白学习知识点【基础版详解】
开发语言·python·学习
我想吃烤肉肉17 小时前
Playwright中page.locator和Selenium中find_element区别
爬虫·python·测试工具·自动化
rabbit_pro17 小时前
Java使用Mybatis-Plus封装动态数据源工具类
java·python·mybatis
Learner17 小时前
Python运算符
开发语言·python
一晌小贪欢17 小时前
Python 精确计算:告别浮点数陷阱,decimal 模块实战指南
开发语言·python·python入门·python3·python小数·python浮点数
空城雀17 小时前
python精通连续剧第一集:简单计算器
服务器·前端·python