深度学习篇---预训练模型

在深度学习中,预训练模型(Pretrained Model) 是提升开发效率和模型性能的 “利器”。无论是图像识别、自然语言处理还是语音识别,预训练模型都被广泛使用。下面从概念、使用原因、场景、作用等方面详细介绍,并结合 Python 代码展示常用预训练模型的使用。

一、什么是预训练模型?(通俗易懂版)

可以把预训练模型理解为:“别人已经训练好的‘半成品模型’,你可以直接拿来用,或者稍作修改就能适配自己的任务”

举个例子:假设你想训练一个 “识别猫和狗” 的模型,需要大量图片和算力。但有人已经用百万张图片(如 ImageNet 数据集)训练了一个 “能识别 1000 种物体” 的模型,这个模型已经学会了 “边缘、纹理、形状” 等通用视觉特征(比如 “猫有耳朵、狗有尾巴”)。你可以直接用这个模型,要么直接预测猫和狗,要么在它的基础上再用少量猫和狗的图片 “微调”,就能快速得到一个好模型。

简言之,预训练模型是 “前人训练好的成果,你可以站在它的肩膀上做开发”。

二、为什么要用预训练模型?

  1. 节省时间和算力
    训练一个复杂模型(如 ResNet、BERT)可能需要几天甚至几周,还需要高性能 GPU。预训练模型已经完成了大部分计算,直接用或微调只需几小时,适合个人或小团队(没有超强算力)。

  2. 数据量少时也能出效果
    深度学习需要大量数据(如几十万张图片),但实际场景中可能只有几千张数据(如自己拍的猫和狗图片)。预训练模型已经 “见过” 海量数据,学到了通用特征,用少量数据微调就能达到不错的效果(否则从头训练可能过拟合)。

  3. 性能更优
    预训练模型通常基于大规模数据集(如 ImageNet 有 1400 万张图片)和优化的网络结构,其学到的特征更通用、更鲁棒。在此基础上微调的模型,性能往往比 “从头训练” 好很多。

三、预训练模型的使用场景

  1. 快速开发原型
    当你需要快速验证一个想法(比如 “用模型识别工厂的零件是否合格”),可以直接用预训练模型做初步测试,不需要从零开始训练。

  2. 数据量有限的任务
    比如医学影像识别(数据少且标注成本高)、小众物体识别(如特定品种的花),用预训练模型微调能显著提升精度。

  3. 迁移学习任务
    从 “通用任务” 迁移到 “具体任务”:比如用 “识别 1000 类物体” 的预训练模型,迁移到 “识别 5 类水果” 的任务;用 “通用文本分类” 的 BERT,迁移到 “情感分析” 任务。

  4. 边缘设备部署
    很多预训练模型有 “轻量化版本”(如 MobileNet、EfficientNet-Lite),适合在手机、摄像头等边缘设备上部署(算力有限但需要快速推理)。

四、预训练模型的作用

  1. 提供通用特征提取能力
    预训练模型的前半部分(如 CNN 的卷积层、Transformer 的编码器)已经学会了通用特征(如图像的边缘、纹理,文本的语义关系),可以直接作为 “特征提取器” 使用。

  2. 加速模型收敛
    微调时,模型参数不需要从 0 开始学习,而是在预训练的 “好起点” 上优化,训练速度更快(比如原本需要 100 个 epoch,微调可能只需 20 个)。

  3. 降低过拟合风险
    预训练模型学到的通用特征能 “抵抗” 小数据集的噪声,减少模型对训练数据的过度依赖(过拟合)。

五、Python 中常用的预训练模型及使用代码

计算机视觉(图像任务) 为例,PyTorch 的torchvision库和 TensorFlow 的tf.keras.applications提供了大量预训练模型。下面以 PyTorch 为例,介绍最常用的模型及代码。

常用预训练模型(图像任务)
模型名称特点适用场景
ResNet(ResNet50/101)结构深、精度高,适合需要高精度的任务图像分类、特征提取
VGG16/VGG19结构简单、特征提取能力强迁移学习、细粒度分类
MobileNetV2/V3轻量化、计算量小手机、摄像头等边缘设备部署
EfficientNet精度与效率平衡(比 ResNet 好且更轻量)兼顾精度和速度的场景
Faster R-CNN经典目标检测模型目标检测(定位 + 分类)
代码示例:使用预训练模型进行图像分类

ResNet50为例,展示 “加载预训练模型→预处理图像→推理预测” 的完整流程。

步骤 1:安装依赖

确保安装了torchtorchvision

pip install torch torchvision
步骤 2:加载预训练模型并查看结构
import torch
from torchvision import models# 加载预训练的ResNet50(pretrained=True表示加载预训练权重)
resnet50 = models.resnet50(pretrained=True)
# 设置为评估模式(关闭 dropout、batchnorm等训练时的层)
resnet50.eval()# 查看模型结构(简化输出)
print("ResNet50结构概览:")
print(resnet50)

模型结构说明

  • 前半部分是conv1layer4的卷积层(特征提取);
  • 后半部分是avgpool(全局平均池化)和fc(全连接层,输出 1000 类,对应 ImageNet 的 1000 个类别)。
步骤 3:图像预处理(必须与预训练一致)

预训练模型对输入图像有固定要求(如尺寸、归一化参数),需严格匹配:

from torchvision import transforms
from PIL import Image# 定义预处理流程(与ResNet训练时的预处理一致)
preprocess = transforms.Compose([transforms.Resize(256),  # 缩放到256x256transforms.CenterCrop(224),  # 中心裁剪到224x224transforms.ToTensor(),  # 转为张量并归一化到0-1# 标准化(使用ImageNet的均值和标准差,必须与预训练一致)transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
步骤 4:用预训练模型进行推理(预测图像类别)
# 读取一张测试图片(如一只猫)
img = Image.open("cat.jpg")  # 替换为你的图片路径
# 预处理
input_tensor = preprocess(img)
# 增加批次维度(模型要求输入是(batch_size, channels, H, W),这里batch_size=1)
input_batch = input_tensor.unsqueeze(0)# 用GPU加速(如果有)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
resnet50.to(device)
input_batch = input_batch.to(device)# 推理(关闭梯度计算,加快速度)
with torch.no_grad():output = resnet50(input_batch)# 输出是1000类的概率(logits),取最大概率的类别
predicted_class = torch.argmax(output[0]).item()# 加载ImageNet的类别名称(1000类)
from torchvision.datasets import ImageNet
# 注意:ImageNet数据集需手动下载,这里简化为加载类别名称(可网上搜索获取)
with open("imagenet_classes.txt") as f:  # 包含1000类名称的文件classes = [line.strip() for line in f.readlines()]print(f"预测类别:{classes[predicted_class]}")

说明imagenet_classes.txt包含 ImageNet 的 1000 个类别名称(如 “猫”“狗”“汽车”),可从网上下载(搜索 “imagenet classes list”)。

步骤 5:微调预训练模型(适配自定义任务)

如果要解决自己的分类任务(如识别 “猫、狗、鸟”3 类),需要微调模型:

# 1. 修改输出层(将1000类改为3类)
num_classes = 3  # 自定义类别数
resnet50.fc = torch.nn.Linear(resnet50.fc.in_features, num_classes)# 2. 冻结部分层(可选,加速训练)
# 冻结前几层(保留预训练的通用特征),只训练最后几层
for param in list(resnet50.parameters())[:-10]:  # 冻结除最后10层外的参数param.requires_grad = False# 3. 定义损失函数和优化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(resnet50.parameters(), lr=0.001)# 4. 加载自定义数据集(假设已通过DataLoader准备好)
# train_loader = ...(自定义数据集的DataLoader)# 5. 微调训练
resnet50.train()
for epoch in range(10):  # 训练10个epochrunning_loss = 0.0for images, labels in train_loader:images, labels = images.to(device), labels.to(device)# 前向传播outputs = resnet50(images)loss = criterion(outputs, labels)# 反向传播+优化optimizer.zero_grad()loss.backward()optimizer.step()running_loss += loss.item()print(f"Epoch {epoch+1}, Loss: {running_loss/len(train_loader):.4f}")

微调关键

  • 修改输出层以匹配自定义类别数;
  • 可选冻结部分层(减少计算量,保留通用特征);
  • 用较小的学习率(避免破坏预训练的好参数)。

六、总结(通俗易懂版)

预训练模型就像 “已经学过基础知识的学霸”:

  • 如果你想快速解决一个问题(如识别图片里的东西),可以直接让学霸帮你 “答题”(推理);
  • 如果你想让学霸学新技能(如识别你的 3 种宠物),只需让他在已有知识上 “稍作练习”(微调),比教一个零基础的人(从头训练)快得多,效果也好得多。

无论是小团队、个人开发者还是企业,合理使用预训练模型都能大幅提升效率,少走弯路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916185.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis ①⑦-分布式锁

分布式锁 分布式锁是锁的一种,都是为了解决多线程/多进程环境下,对共享资源的访问冲突问题。 不过,像 Java 的 synchronized 或者 C 的 mutex 这种锁,都是进程内的锁,而分布式锁则是跨越进程/机器的锁。也就是可以针对…

OpenCV-图像预处理➀【图像颜色空间转换、灰度化实验、二值化处理、镜像翻转 和 仿射变换】

文章目录先言一、图像颜色空间转换1.RGB颜色空间2.颜色加法3.颜色加权加法4.HSV颜色空间5.图像转换(cvtColor())二、灰度实验1.灰度图2.图像灰度化(最大值法)3.图像灰度化(平均值法)4.图像灰度化&#xff0…

APP逆向 day9 安卓开发基础

一.前言 app逆向当然要学安卓基础啦!今天我们来教安卓基础当然,安卓基础不会教的很多,比java还要少,还是那句话,了解就好。 二.安卓环境搭建 2.1 安卓介绍 如果做安卓开发 需要会java代码安卓SDK(安卓提供的内置…

Jmeter的元件使用介绍:(三)配置元件详解02

六、计数器 可以用来做一些变量自增操作。 1、Starting value:定义初始值 2、递增:定义每次执行递增多少 3、Maximum value:定义承受的最大值 4、数据格式:可以不填,也可以定义成000;001;002等等任意格式都行。(1)如…

JavaWeb学习打卡15(JSP标签、JSTL标签、EL表达式)

EL表达式&#xff1a;${ }获取数据执行运算获取web开发的常用对象在pom.xml 文件中导入JSP、JSTL相关依赖&#xff1a;<!--JSP依赖--><!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --><dependency><groupId>java…

7.22数据结构——顺序表

文章目录一、思维导图二、实现顺序表的功能代码head.htest.cmain.c一、思维导图 二、实现顺序表的功能代码 head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> //数组的最大长度 #define MAXSIZE …

【如何无限制免费试用 IDEA || Pycharm(JB 全家桶)】

如何无限制免费试用 IDEA || Pycharm(JB 全家桶) 一、目标:解决 JB 全家桶试用时长痛点 如果你是程序员,大概率用过 JetBrains 家的 IDE——IDEA 写 Java、Pycharm 写 Python、WebStorm 做前端,体验确实顶流,但官方 30 天试用到期后,动辄几千的年费实在让人肉痛。 咱…

Qt(资源库和按钮组)

这一节是对上一节的补充&#xff0c;上一节提到QLabel类和QAabstractButton类&#xff0c;这节内容&#xff1a;1.如设置资源库&#xff0c;使用资源设置图片2. 使用按钮组管理多个按钮。一、资源库1. 资源库作用Qt的资源库&#xff08;Resource System&#xff0c;.qrc文件&am…

一道检验编码能力的字符串的题目

#include<iostream> #include<vector> #include<string> using namespace std; int bNum0,gNum0; int findEnd(string& s,int si){int lens.size();//当前字母在哪个字符串中,存入comp中string comp;if(s[si]b||s[si]o||s[si]y){comp"boy";bNu…

UniApp X 网络请求避坑指南:从 JS 到 UTS 的 JSON 数据处理全解析

在 UniApp 开发中&#xff0c;我们经常需要通过 uni.request 获取服务器返回的 JSON 数据&#xff0c;并将其绑定到页面或进行逻辑处理。但在 UniApp X&#xff08;基于 UTS&#xff09; 中&#xff0c;由于引入了 强类型语言特性&#xff0c;处理 JSON 数据的方式与 JS 有明显…

iOS 网络请求常用依赖库与系统自带 API 介绍与示例

iOS 网络请求常用依赖库与系统自带 API 介绍与示例 在 iOS 开发中&#xff0c;进行网络请求是几乎所有应用都不可或缺的功能。开发者有多种选择来处理网络通信&#xff0c;从系统自带的 URLSession 到各种流行的第三方库。下面我将为您介绍 URLSession、AFNetworking、Alamofir…

JavaScript 中 let 在循环中的作用域机制解析

一、let在循环中的特殊性 let作为ES6引入的块级作用域声明&#xff0c;在循环结构中存在特殊行为&#xff0c;其核心区别于var的函数作用域特性。理解这一特性对于编写正确的闭包逻辑至关重要。 在 ECMAScript 规范里&#xff0c;let声明的变量具有块级作用域特性&#xff0c;这…

@Subscribe@AllowConcurrentEvents解析这两个注解

@Subscribe@AllowConcurrentEvents解析这两个注解 @Subscribe 和 @AllowConcurrentEvents 是 Guava EventBus(Google 开源的事件总线框架)中用于处理事件订阅的注解,主要用于实现组件间的解耦通信。下面分别解析: 1. @Subscribe 注解 作用:标记一个方法为事件订阅者方法,…

好看的小程序推广单页HTML源码 可用作导航页

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 响应式的小程序推广单页HTML源码。这个设计采用了现代化的UI元素&#xff0c;包含吸引人的标题、特性展示、二维码区域和行动号召按钮。 二、效果展示 1.部分代码 代码如下&#xff0…

华为仓颉编程语言实践体验

华为仓颉编程语言实践体验 目前华为仓颉编程语言因为其推出时间较短&#xff0c;生态系统不完善。官网资料权威&#xff0c;但比较庞大难懂。快速实验入门&#xff0c;是学习一门编程语言的法宝。网上靠谱的资料稀少&#xff0c;特此撰文介绍&#xff0c;帮助初学者减少挫折感&…

YOLOv11实战,使用YOLOv11训练自己的数据集和推理(附YOLOv11网络结构图)

2024年计算机视觉领域的颠覆性突破,YOLOv11以22%的参数量减少和0.3%的mAP提升重新定义实时目标检测的边界 本文将手把手带你完成YOLOv11的全流程实战,包含环境配置、数据准备、模型训练、推理部署及创新优化方案,并深度解析其网络架构设计思想。 一、YOLOv11核心创新解析 …

macOS xcode打包ios测试ipa应用包

可以参考&#xff1a; https://blog.csdn.net/sinat_34104446/article/details/133684756 过程中遇到很多稀奇古怪的报错&#xff0c;基本重启电脑即可解决。。。在我按照上面的步骤申请并导入新证书后&#xff0c;还遇到了一个问题&#xff1a;解决办法&#xff1a; https://b…

STM32基础知识学习笔记:ICODE、DCODE、DMA等常见名词的解释

基于AI生成内容。 ICODEICODE&#xff1a;指令总线&#xff08;Instruction Bus&#xff09; 主要用于处理 CPU 对程序指令的读取操作。它是 STM32 存储架构中重要的组成部分&#xff0c;与数据总线&#xff08;DCODE&#xff09;、系统总线&#xff08;System Bus&#xff09;…

谁将统治AI游戏时代?腾讯、网易、米哈游技术暗战

游戏行业的“产能天花板”正被AI技术轰然击穿。腾讯、网易、米哈游……所有的游戏厂商都在押注AI&#xff0c;腾讯混元发布混元游戏视觉生成平台&#xff0c;分钟级生成高精度游戏角色&#xff1b;网易《蛋仔派对》借AI实现UGC创作平民化&#xff1b;米哈游新作更以实时多模态对…

基于springboot的工商局商家管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…