当前位置: 首页 > article >正文

深度学习预训练和微调

目录

1. 预训练(Pre-training)是什么?

2. 微调(Fine-tuning)是什么?

3. 预训练和微调的对象

4. 特征提取如何实现?

预训练阶段:

微调阶段:

5. 这样做的作用和意义

6. 简单代码示例(PyTorch风格)

预训练用于特征提取

微调用于特征提取优化

具体操作步骤

7.总结


1. 预训练(Pre-training)是什么?

  • 定义:在大型通用数据集(如MS-Celeb-1M)上训练一个模型,使其学习通用的特征表示(例如人脸的特征向量)。

  • 例子

    • 数据集:MS-Celeb-1M(包含100万名人脸图像,用于人脸识别任务)。

    • 目标:训练一个模型(如ResNet、ArcFace)学习如何提取人脸的通用特征(例如五官结构、光照不变性等)。

    • 预训练的输出:得到一个初步的神经网络模型,它的权重已经能较好地表征人脸特征。

  • 为什么预训练?

    • 大数据的预训练能让模型学到更鲁棒的特征,避免从小数据(如VoxCeleb1)从头训练导致的过拟合。

    • 例如,就像先让一个人阅读大量的不同类型的书籍(相当于用大规模数据预训练),目的是让这个人(模型)先掌握一些通用的知识(面部特征的通用表示),比如面部的轮廓、五官的基本形状特征等知识。


2. 微调(Fine-tuning)是什么?

  • 定义:在预训练模型的基础上,用特定任务的小数据集(如VoxCeleb1)进一步调整模型参数,使其适应新任务。

  • 你的例子

    • 数据集:VoxCeleb1(包含说话人视频,用于声纹识别或人脸+语音的多模态任务)。

    • 操作

      1. 保留预训练模型的底层结构(如卷积层,因底层通常提取通用特征如边缘、纹理)。

      2. 修改顶层(如全连接层),适应新任务的类别数(例如VoxCeleb1的说话人ID)。

      3. 用VoxCeleb1的数据微调模型,调整权重以适应新数据分布。

  • 为什么微调?

    • 直接训练小数据效果差,而预训练模型提供了更好的初始化,微调只需少量数据即可达到高性能。

    • 就好像那个已经读过很多书的人(预训练过的模型),现在需要针对某个特定领域的知识(VoxCeleb1数据集所代表的特定任务,如可能的声纹 - 面部关联等任务)进行重点学习和复习(微调),以便更好地完成这个特定任务。


3. 预训练和微调的对象

  • 预训练的内容

    • 模型结构:通常是CNN(如ResNet)或Transformer(如ViT)。

    • 学习到的参数:卷积核权重、全连接层参数等。

    • 目标函数:人脸识别常用ArcFace LossSoftmax Loss

  • 微调的内容

    • 分类头重置:替换最后的全连接层(输出维度改为VoxCeleb的说话人数量)。

    • 参数调整

      • 方案1:全部层微调(数据充足时)。

      • 方案2:冻结浅层(仅调深层,防止小数据过拟合)。

4. 特征提取如何实现?

预训练阶段
  1. 模型选择:选一个特征提取网络(如ResNet50、FaceNet)。

  2. 损失函数:用人脸识别常用的损失(如ArcFace、Triplet Loss),迫使模型学习区分不同人脸的特征。

  3. 输出:模型最后一层前的特征(如512维向量)即为提取的人脸特征。

微调阶段
  1. 迁移特征提取器:将预训练模型的卷积部分(特征提取器)直接迁移到新任务。

  2. 调整分类层:替换顶层分类器,匹配VoxCeleb1的类别数(如1251个说话人)。

  3. 选择性训练

    • 方案1:仅训练顶层(特征提取器固定,适用于数据极少的情况)。

    • 方案2:全部层微调(数据较多时效果更好)。


5. 这样做的作用和意义

  • 作用

    • 提升小数据任务的性能(VoxCeleb1的数据量远小于MS-Celeb-1M)。

    • 节省计算资源(无需从头训练)。

  • 意义

    • 特征可迁移性:预训练模型学到的底层特征(如边缘、纹理)对多数视觉任务通用。

    • 避免过拟合:小数据直接训练易记住噪声,预训练模型提供了正则化效果。


6. 简单代码示例(PyTorch风格)

# 预训练模型加载(以人脸识别为例)
pretrained_model = torchvision.models.resnet50(pretrained=False)
pretrained_model.load_state_dict(torch.load('msceleb_pretrained.pth'))
​
# 微调:替换顶层并训练
num_classes = 1251  # VoxCeleb1的说话人数
pretrained_model.fc = nn.Linear(pretrained_model.fc.in_features, num_classes)
​
# 只微调顶层(可选)
for param in pretrained_model.parameters():param.requires_grad = False
pretrained_model.fc.requires_grad = True
​
# 特征提取(不训练时)
features = pretrained_model.conv_layers(input_image)

预训练用于特征提取

  • 过程 :在大规模数据集(如 MS - Celeb - 1M)上预训练模型,让模型学习到通用的面部特征表示。在这个阶段,模型会自动提取出图像中诸如边缘、纹理、轮廓等基础特征,以及更高层次的语义特征,比如面部的各个组成部分(眼睛、鼻子、嘴巴等)的位置和形状特征,这些特征在人脸识别相关的任务中具有通用性。

  • 作用 :得到一个具有较强特征提取能力的模型,它能够将输入的面部图像转换为具有一定语义意义的特征向量。这些特征向量可以作为后续任务(如在 VoxCeleb1 数据集上的声纹 - 面部关联任务等)的输入,为后续任务提供丰富的特征表示,减少了在新任务上从头开始训练模型提取特征的时间和资源消耗。

微调用于特征提取优化

  • 过程 :当在 VoxCeleb1 数据集上进行微调时,会基于预训练模型提取的特征,进一步调整模型的参数,使其更好地适应 VoxCeleb1 数据集的特点和任务需求。例如,在声纹 - 面部关联任务中,微调可以使模型更关注那些对于关联判断重要的面部特征,如面部的动态表情变化特征(如果视频中有面部表情变化)或者与声纹特征相关联的面部肌肉运动特征等。

  • 作用 :优化后的特征提取模型能够更精准地提取出与 VoxCeleb1 任务相关的特征,提高任务的性能。这是因为微调过程让模型在预训练的基础上,结合新数据集的特定信息,对特征提取的重点和细节进行了调整,使特征更能反映新任务中的关键信息。

具体操作步骤

  1. 预训练阶段(以面部特征提取为例在 MS - Celeb - 1M 数据集上)

    • 数据准备 :收集、清洗和预处理 MS - Celeb - 1M 数据集中的面部图像,包括图像的标准化(调整大小、像素值归一化等)、数据增强(旋转、翻转、裁剪等)操作,以增加数据的多样性和模型的泛化能力。

    • 模型构建 :选择合适的深度学习架构,如卷积神经网络(CNN)。可以使用常见的网络结构如 ResNet、VGG 等,确定网络的层数、每层的神经元数量、卷积核大小、激活函数等超参数。

    • 训练模型 :将预处理后的 MS - Celeb - 1M 数据输入到构建的模型中,设置合适的训练参数,如学习率、批次大小、训练的迭代次数等。通过优化算法(如随机梯度下降 SGD 或 Adam)来更新模型的权重参数,使模型在 MS - Celeb - 1M 数据集上学习到良好的面部特征表示。在训练过程中,可以使用损失函数(如交叉熵损失等)来衡量模型输出与真实标签之间的差异,并通过反向传播来调整模型参数。

    • 保存预训练模型 :在预训练完成后,保存模型的结构和权重参数,以便后续在 VoxCeleb1 数据集上进行微调。

  2. 微调阶段(在 VoxCeleb1 数据集上用于特定特征提取任务)

    • 数据准备 :收集和预处理 VoxCeleb1 数据集。对于视频数据,可以提取视频中的关键帧作为面部图像输入,同时对音频进行特征提取(如梅尔频谱特征等),并整理好相应的标签(如声纹 - 面部是否关联等)。

    • 加载预训练模型 :将之前保存的在 MS - Celeb - 1M 数据集上预训练得到的模型加载到训练环境中。

    • 修改模型(如果需要) :根据 VoxCeleb1 数据集的任务需求,对模型的输出层或者部分中间层进行修改。例如,如果任务是声纹 - 面部关联的二分类任务,可以将预训练模型的输出层修改为两个神经元的全连接层;如果需要融合音频和视频特征,可以添加融合模块来整合预训练模型提取的面部特征和音频特征。

    • 微调训练 :使用 VoxCeleb1 数据集对修改后的模型进行训练。此时,学习率通常会比预训练时小,因为模型已经在预训练阶段学习到了很多通用的特征,微调阶段主要是对模型进行小幅度的调整。通过优化算法对模型的权重进行更新,使模型能够适应 VoxCeleb1 数据集的特定特征和任务。在训练过程中,可以使用验证集来评估模型的性能,防止过拟合,并在适当的时机停止训练(如使用早停策略)。

    • 特征提取与应用 :在微调完成后,可以使用该模型对 VoxCeleb1 数据集中的面部图像进行特征提取,得到优化后的特征向量。这些特征向量可以用于后续的任务,如声纹 - 面部关联判断,通过计算提取的面部特征与声纹特征之间的相似度等方法来完成任务。

7.总结

  • 预训练:在大数据集上学通用特征。

  • 微调:在小数据集上调整模型以适应新任务。

  • 意义:提升小数据性能、节省资源、避免过拟合。

相关文章:

深度学习预训练和微调

目录 1. 预训练(Pre-training)是什么? 2. 微调(Fine-tuning)是什么? 3. 预训练和微调的对象 4. 特征提取如何实现? 预训练阶段: 微调阶段: 5. 这样做的作用和意义 …...

AI 速读 SpecReason:让思考又快又准!

在大模型推理的世界里,速度与精度往往难以兼得。但今天要介绍的这篇论文带来了名为SpecReason的创新系统,它打破常规,能让大模型推理既快速又准确,大幅提升性能。想知道它是如何做到的吗?快来一探究竟! 论…...

Qt通过ODBC和QPSQL两种方式连接PostgreSQL或PolarDB PostgreSQL版

一、概述 以下主要在Windows下验证连接PolarDB PostgreSQL版(阿里云兼容 PostgreSQL的PolarDB版本)。Linux下类似,ODBC方式则需要配置odbcinst.ini和odbc.ini。 二、代码 以下为完整代码,包含两种方式连接数据库,并…...

MobaXterm连接Ubuntu(SSH)

1.查看Ubuntu ip 打开终端,使用指令 ifconfig 由图可知ip地址 2.MobaXterm进行SSH连接 点击session,然后点击ssh,最后输入ubuntu IP地址以及用户名...

Lambda 函数与 peek 操作的使用案例

Lambda 函数和 peek 操作是 Java 8 Stream API 中非常有用的特性&#xff0c;下面我将介绍它们的使用案例。 Lambda 函数使用案例 Lambda 表达式是 Java 8 引入的一种简洁的匿名函数表示方式。 集合操作 List<String> names Arrays.asList("Alice", "B…...

C# 的 字符串插值($) 和 逐字字符串(@) 功能

这段代码使用了 C# 的 字符串插值&#xff08;$&#xff09; 和 逐字字符串&#xff08;&#xff09; 功能&#xff0c;并在 SQL 语句中动态拼接变量。下面详细解释它们的用法&#xff1a; 1. $&#xff08;字符串插值&#xff09; $ 是 C# 的 字符串插值 符号&#xff0c;允许…...

软考 中级软件设计师 考点知识点笔记总结 day13 数据库系统基础知识 数据库模式映像 数据模型

文章目录 数据库系统基础知识6.1 基本概念6.1.1 DBMS的特征与分类 6.2 数据库三级模式两级映像6.3 数据库的分析与设计过程6.4 数据模型6.4.1 ER模型6.4.2 关系模型 数据库系统基础知识 基本概念 数据库三级模式两级映像 数据库的分析与设计过程 数据模型 关系代数 数据库完整…...

蓝桥杯2024省A.成绩统计

蓝桥杯2024省A.成绩统计 题目 题目解析与思路 题目要求返回至少要检查多少个人的成绩&#xff0c;才有可能选出k名同学&#xff0c;他们的方差小于一个给定的值 T 二分枚举答案位置&#xff0c;将答案位置以前的数组单独取出并排序&#xff0c;然后用k长滑窗O(1)计算方差 问…...

Mac mini 安装mysql数据库以及出现的一些问题的解决方案

首先先去官网安装一下mysql数据库&#xff0c;基本上都是傻瓜式安装的流程&#xff0c;我也就不详细说了。 接下来就是最新版的mysql安装的时候&#xff0c;他就会直接让你设置一个新的密码。 打开设置&#xff0c;拉到最下面就会看到一个mysql的图标&#xff1a; 我设置的就是…...

俄罗斯方块-简单开发版

一、需求分析 实现了一个经典的俄罗斯方块小游戏&#xff0c;主要满足以下需求&#xff1a; 1.图形界面 使用 pygame 库创建一个可视化的游戏窗口&#xff0c;展示游戏的各种元素&#xff0c;如游戏区域、方块、分数等信息。 2.游戏逻辑 实现方块的生成、移动、旋转、下落和锁…...

STM32的启动方式

目录 一、从主闪存存储器启动&#xff08;Main Flash Memory&#xff09; 二、从系统存储器启动&#xff08;System Memory&#xff09; 三、从内置SRAM启动&#xff08;Embedded SRAM&#xff09; 四、从外挂存储介质启动的实现方式 1. 存储介质选型 2. 硬件连接 3. 引…...

你学会了些什么200601?--Flask搭建造测试数据平台

搭建造数平台的环境&#xff1a; ***python3.7 ***html5 ***css ***JavaScript ***Ajax ***MySQL 前台页面的显示 1.为了页面美化&#xff0c;使用了JavaScript&#xff0c;通过逐级展开/隐藏的的方式显示下一级菜单 2.为了在提交表单数据时页面不发生跳转&#xff0c;需要引用…...

【音视频】FLV格式分析

FLV概述 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式&#xff0c;由于其封装后的⾳视频⽂件体积⼩、封装简单等特点&#xff0c;⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤FLV格式封装的⽂件后缀为.flv。 FLV封装格式是由⼀个⽂件头(file header)和…...

Keil5没有stm32的芯片库

下载完重启就行了&#xff0c;我这里就不演示了&#xff0c;stm已经下载&#xff0c;随便选的一个芯片库演示一下...

【DVWA 靶场通关】 File Inclusion(文件包含漏洞)

1. 前言 文件包含漏洞 是 Web 应用中较为常见的漏洞之一&#xff0c;攻击者通过操控文件路径&#xff0c;访问或包含系统上的敏感文件&#xff0c;甚至执行恶意代码。DVWA&#xff08;Damn Vulnerable Web Application&#xff09;提供了一个理想的实验环境&#xff0c;让安全…...

游戏引擎学习第229天

仓库:https://gitee.com/mrxiao_com/2d_game_5 回顾上次内容并介绍今天的主题 上次留下的是一个非常简单的任务&#xff0c;至少第一步是非常简单的。我们需要在渲染器中加入排序功能&#xff0c;这样我们的精灵&#xff08;sprites&#xff09;才能以正确的顺序显示。为此我…...

【C++编程入门】:从零开始掌握基础语法

C语言是通过对C语言不足的地方进行优化创建的&#xff0c;C在C语言之上&#xff0c;C当然也兼容C语言&#xff0c; 在大部分地方使用C比C更方便&#xff0c;可能使用C需要一两百行代码&#xff0c;而C只需要五六十行。 目录 C关键字 命名空间 缺省参数 缺省参数分类 函数…...

Python3网络爬虫开发--爬虫基础

网络爬虫基础 1.1 HTTP基本原理 1.1.1 URI和URL URI即统一资源标志符,URL即统一资源定位符。 有这样一个链接,http://test.com/test.txt,在这个链接中,包含了访问协议https,访问目录(即根目录),资源名称(test.txt)。通过这样的链接,可以在互联网上找到这个资源,这…...

网络开发基础(游戏方向)之 概念名词

前言 1、一款网络游戏分为客户端和服务端两个部分&#xff0c;客户端程序运行在用户的电脑或手机上&#xff0c;服务端程序运行在游戏运营商的服务器上。 2、客户端和服务端之间&#xff0c;服务端和服务端之间一般都是使用TCP网络通信。客户端和客户端之间通过服务端的消息转…...

MyBatisPlus-QueryWrapper的exists方法拼接SQL中的EXISTS子句

在 MyBatis-Plus 中,QueryWrapper 的 exists 方法用于拼接 SQL 中的 EXISTS 子句,通常用于构 建子查询条件。以下是具体用法和示例: ​​1. 基本语法​​ // 判断是否存在符合条件的记录 queryWrapper.exists(String existsSql); queryWrapper.notExists(String existsSq…...

【源码】【Java并发】【AQS】从ReentrantLock、Semaphore、CutDownLunch、CyclicBarrier看AQS源码

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f4da;欢迎订阅专栏…...

k8s介绍与实践

第一节 理论 基础介绍&#xff0c;部署实践&#xff0c;操作实践&#xff0c;点击这里学习 第二节 dashboard操作 查看安装的dashboard服务信息 kubectl get pod,svc -n kubernetes-dashboard 网页登录地址&#xff1a;https://server_ip:30976/#/login 创建token kube…...

SpringBoot 3 与 SpringDoc 打造完美接口文档

文章目录 1. SpringDoc 简介1.1 SpringDoc 优势2. 环境准备2.1 Maven 依赖2.2 基础配置3. 创建基本文档配置类4. 控制器 API 文档注解4.1 基本控制器示例4.2 模型类示例5. 高级功能5.1 API分组5.2 安全配置5.3 隐藏特定端点6. 参数描述6.1 路径参数6.2 查询参数6.3 请求体7. 响…...

【HFP】蓝牙HFP协议音频连接核心技术深度解析

目录 一、音频连接建立的总体要求 1.1 发起主体与时机 1.2 前提条件 1.3 同步连接的建立 1.4 通知机制 二、不同主体发起的音频连接建立流程 2.1 连接建立触发矩阵 2.2 AG 发起的音频连接建立 2.3 HF 发起的音频连接建立 三、编解码器连接建立流程 3.1 发起条件 3.…...

KRaft面试思路引导

Kafka实在2.8之后就用KRaft进行集群管理了 Conroller负责选举Leader&#xff0c;同时Controller管理集群元数据状态信息&#xff0c;并将元数据信息同步给各个分区的Leader 和Zookeeper管理一样&#xff0c;会选出一个Broker作为Controller去管理整个集群&#xff0c;但是元数…...

FreeRTOS菜鸟入门(六)·移植FreeRTOS到STM32

目录 1. 获取裸机工程模版 2. 下载 FreeRTOS V9.0.0 源码 3. FreeRTOS文件夹内容简介 3.1 FreeRTOS文件夹 3.1.1 Demo文件夹 3.1.2 License 文件夹 3.1.3 Source 文件夹 3.2 FreeRTOS-Plus 文件夹 4. 往裸机工程添加 FreeRTOS 源码 5. 拷贝 FreeRTOSConfig…...

14.第二阶段x64游戏实战-分析人物的名字

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;13.第二阶段x64游戏实战-分析人物等级和升级经验 名字&#xff08;中文英文符号…...

【CS*N是狗】亲测可用!!WIN11上禁用Chrome自动更新IDM插件

现象&#xff1a;每次打开chrome后IDM会弹出提示插件版本不一致。经过排查后发现是chrome把IDM插件给更新了&#xff0c;导致IDM提示版本不匹配。经过摸索后&#xff0c;得到了可行的方案。 第一步&#xff0c;打开Chrome&#xff0c;把IDM插件卸载掉&#xff0c;然后重新安装I…...

漫游git rebase + 浅谈git checkout和git branch -f的分支命令

今天学了两个命令非常有意思&#xff1a;一个是git checkout&#xff0c;一个是git branch -f。我们可以认为在提交树上&#xff0c;任何一个节点代表着一次提交。并且&#xff0c;git commit将会在 H E A D HEAD HEAD指针指向的节点上进行进一步提交。将每一个分支名视为标记当…...

深入理解 React 组件的生命周期:从创建到销毁的全过程

React 作为当今最流行的前端框架之一&#xff0c;其组件生命周期是每个 React 开发者必须掌握的核心概念。本文将全面剖析 React 组件的生命周期&#xff0c;包括类组件的各个生命周期方法和函数组件如何使用 Hooks 模拟生命周期行为&#xff0c;帮助开发者编写更高效、更健壮的…...