Python Day44

Task:
1.预训练的概念
2.常见的分类预训练模型
3.图像预训练模型的发展史
4.预训练的策略
5.预训练代码实战:resnet18


1. 预训练的概念

预训练(Pre-training)是指在大规模数据集上,先训练模型以学习通用的特征表示,然后将其用于特定任务的微调。这种方法可以显著提高模型在目标任务上的性能,减少训练时间和所需数据量。

核心思想:

  • 在大规模、通用的数据(如ImageNet)上训练模型,学习丰富的特征表示。
  • 将预训练模型应用于任务特定的细调(fine-tuning),使模型适应目标任务。

优势:

  • 提升模型性能
  • 缩短训练时间
  • 需要较少的标注数据
  • 提供良好的特征初始化

2. 常见的分类预训练模型

常见的分类预训练模型主要包括:

模型名称提出年份特色与应用
AlexNet2012标志深度学习重返计算机视觉的起点
VGG(VGG16/19)2014简洁结构,深层网络,广泛用于特征提取
ResNet(Residual Network)2015引入残差连接,解决深层网络退化问题
Inception(GoogLeNet)2014多尺度特征提取,复杂模块设计
DenseNet2017密集连接,加深网络而不增加参数
MobileNet2017轻量级模型,适合移动端应用
EfficientNet2019根据模型宽度、深度和分辨率优化设计

这些模型在ImageNet等大规模数据集上预训练,成为计算机视觉各种任务的基础。


3. 图像预训练模型的发展史

  1. AlexNet (2012)
    首次使用深度卷积神经网络大规模应用于ImageNet,显著提升分类效果。

  2. VGG系列 (2014)
    简单堆叠卷积和池化层,深度逐步增加,提高表现。

  3. GoogLeNet/Inception (2014)
    引入Inception模块,进行多尺度特征提取,有效提升效率。

  4. ResNet (2015)
    通过残差连接解决深层网络的退化问题,使网络深度大幅提升(如ResNet-50,ResNet-101等)。

  5. DenseNet (2017)
    特色是密集连接,增强特征传播,改善梯度流。

  6. MobileNet, EfficientNet (2017-2019)
    追求轻量级和高效率,适应移动端和资源有限场景。

总的趋势:

  • 从浅层逐步向深层网络发展
  • 引入残差、密集连接等结构解决深层网络训练难题
  • 注重模型效率与性能平衡

4. 预训练的策略

常用的预训练策略包括:

1. 直接使用预训练模型进行微调(Fine-tuning)

  • 加载预训练权重
  • 替换最后的分类层以适应新任务(如类别数不同)
  • 选择性冻结部分层(如只训练最后几层)或全部训练

2. 特征提取(Feature Extraction)

  • 使用预训练模型的固定特征提取器,从中提取特征
  • 在这些特征基础上训练简单的分类器(如SVM或线性层)

3. 逐层逐步微调(Layer-wise Fine-tuning)

  • 先冻结底层特征层,只训练高层
  • 再逐步解冻低层,进行全层微调

4. 迁移学习(Transfer Learning)

  • 利用预训练模型迁移到相似领域任务中
  • 通过微调适应不同数据分布和任务需求

5. 预训练代码实战:ResNet18

以下是基于PyTorch框架的ResNet18预训练模型加载和微调的示例代码:

import torch
import torch.nn as nn
import torchvision.models as models
import torchvision.transforms as transforms
from torchvision.datasets import ImageFolder
from torch.utils.data import DataLoader# 1. 加载预训练ResNet18模型
model = models.resnet18(pretrained=True)# 2. 替换分类层以适应新任务(比如有10个类别)
num_classes = 10
model.fc = nn.Linear(model.fc.in_features, num_classes)# 3. 冻结前面层,只训练最后的全连接层(可选)
for param in model.parameters():param.requires_grad = False  # 冻结所有参数# 只训练最后一层参数
for param in model.fc.parameters():param.requires_grad = True# 4. 定义数据变换
transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]),
])# 5. 加载数据集
train_dataset = ImageFolder('path_to_train_data', transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)val_dataset = ImageFolder('path_to_val_data', transform=transform)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)# 6. 设置优化器(只优化可训练参数)
optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-3)
criterion = nn.CrossEntropyLoss()# 7. 训练环节
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)for epoch in range(10):model.train()total_loss = 0for images, labels in train_loader:images = images.to(device)labels = labels.to(device)optimizer.zero_grad()outputs = model(images)loss = criterion(outputs, labels)loss.backward()optimizer.step()total_loss += loss.item()print(f"Epoch {epoch+1}, Loss: {total_loss/len(train_loader):.4f}")# 8. 评估
model.eval()
correct = 0
total = 0
with torch.no_grad():for images, labels in val_loader:images = images.to(device)labels = labels.to(device)outputs = model(images)_, predicted = torch.max(outputs, 1)correct += (predicted == labels).sum().item()total += labels.size(0)
print(f'Validation Accuracy: {100 * correct / total:.2f}%')

总结

  • 预训练是一种利用大规模数据学习通用特征,从而在目标任务中快速获得优秀表现的技术。
  • 常用的分类预训练模型包括ResNet、VGG、Inception等,发展经历了从浅层到深层、从视觉到效率的不断演变。
  • 预训练策略多样,适应不同场景,微调与特征提取是常用手段。
  • 实战中,可以利用PyTorch提供的模型接口快速加载预训练模型,并进行微调以满足具体需求。

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

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

相关文章

vue3 eslint ts 关闭多单词命名检查

无效做法 import { globalIgnores } from eslint/config import {defineConfigWithVueTs,vueTsConfigs, } from vue/eslint-config-typescript import pluginVue from eslint-plugin-vue import skipFormatting from vue/eslint-config-prettier/skip-formatting// To allow m…

贪心,回溯,动态规划

1.贪心算法 ​ 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望全局最好或是最优的算法。 特点 局部最优选择不能保证全局最优高效 适用条件 局部最优可以导致全局最优问题的最优解包含子问题的最优解 经典问题 活动选择问题最短路径最…

【Netty4核心原理⑧】【揭开Bootstrap的神秘面纱 - 服务端Bootstrap❶】

文章目录 一、前言二、流程分析1. 创建 EventLoopGroup2. 指定 Channel 类型2.1 Channel 的创建2.2 Channel 的初始化 3. 配置自定义的业务处理器 Handler3.1 ServerBootstrap#childHandler3.2 handler 与 childHandler 的区别 4. 绑定端口服务启动 三、bossGroup 与 workerGro…

为什么需要自动下载浏览器驱动?

为什么需要自动下载浏览器驱动? 血泪场景重现 新人入职第一天: 花3小时配置Chrome/Firefox驱动版本不匹配导致SessionNotCreatedException 浏览器自动更新后: 所有测试脚本突然崩溃手动查找驱动耗时长 终极解决方案:自动下载驱…

NLP常用工具包

✨做一次按NLP项目常见工具的使用拆解 1. tokenizer from torchtext.data.utils import get_tokenizertokenizer get_tokenizer(basic_english) text_sample "Were going on an adventure! The weather is really nice today." tokens tokenizer(text_sample) p…

在 Vue 的template中使用 Pug 的完整教程

在 Vue 的template中使用 Pug 的完整教程 引言 什么是 Pug? Pug(原名 Jade)是一种高效的网页模板引擎,通过缩进式语法和简洁的写法减少 HTML 的冗长代码。Pug 省略了尖括号和闭合标签,使用缩进定义结构,…

【Android基础回顾】四:ServiceManager

Android 中的 ServerManager 是 Android 框架中一个用于管理系统服务的核心机制。它是 Binder IPC 的一部分,用于在客户端和服务端之间建立联系,广泛应用于系统服务(如 ActivityManager、WindowManager 等)的注册与获取。 1 Serv…

【Android基础回顾】一:Binder机制是什么?有什么用?

Android中的Binder机制是Android系统中最核心和最基础的进程间通讯机制。 1 什么是进程间通讯机制(IPC)? 众所周知,Android系统基于Linux开发,Linux系统里面本来就有进程间通讯机制。 1.1 Linux的IPC(Inter-Process Communication)概览 它…

Go语言爬虫系列教程5:HTML解析技术以及第三方库选择

Go语言爬虫系列教程5:HTML解析技术以及第三方库选择 在上一章中,我们使用正则表达式提取网页内容,但这种方法有局限性。对于复杂的HTML结构,我们需要使用专门的HTML解析库。在这一章中,我们将介绍HTML解析技术以及如何…

AtCoder 第408​场初级竞赛 A~E题解

A Timeout 【题目链接】 原题链接:A - Timeout 【考点】 模拟 【题目大意】 长老会在 s 秒后睡去,进过 n 次叫醒,长老最后能否是保持清醒。 【解析】 模拟每一次拍击叫醒的过程,查看本次时间距上次时间是否大于 s。注意:第一次拍击叫醒应和 0 秒相减。 【难度】 …

Unity VR/MR开发-VR设备与适用场景分析

视频讲解链接:【XR马斯维】VR/MR设备与适用场景分析?【UnityVR/MR开发教程--入门】_游戏热门视频

MyBatis 查询功能实现全流程

一、创建maven项目 配置好相应的jdk 二、在数据库建立相应的表格 1.因为Mybatis实际是对sql表的一系列操作,所以我们新建一个数据库 2.在查询界面运行下面指令创建一个user表 CREATE TABLE user (id int(11) NOT NULL AUTO_INCREMENT,username varchar(32) NOT NU…

tcp/udp

tcp/udp协议概述 传输层协议基本概念 传输层协议建立在网络层和会话层之间,为应用层实体提供端到端的通信功能,确保数据包的顺序传送及数据的完整性。它利用网络层提供的服务,并通过传输层地址(端口号)提供给高层用户…

k8s集群安装坑点汇总

前言 由于使用最新的Rocky9.5,导致kubekey一键安装用不了,退回Rocky8麻烦机器都建好了,决定手动安装k8s,结果手动安装过程中遇到各种坑,这里记录下; k8s安装 k8s具体安装过程可自行搜索,或者deepseek; 也…

深入解析 Dotnet-Boxed.Framework:提升 .NET 开发效率的利器

在现代 .NET 开发中,框架和工具的选择对项目的开发效率和长期维护至关重要。Dotnet-Boxed.Framework 是一个开源框架,旨在简化开发流程,提高生产力。它通过一组实用的工具和自动化功能,帮助开发者快速构建高质量的应用程序。本文将…

如何轻松地将文件从 PC 传输到 iPhone?

传统上,您可以使用 iTunes 将文件从 PC 传输到 iPhone,但现在,使用 iTunes 已不再是唯一的选择。现在有多种不同且有效的方法可以帮助您传输文件。在今天的指南中,您可以找到 8 种使用或不使用 iTunes 传输文件的方法,…

Kafka深度解析与原理剖析

文章目录 一、Kafka核心架构原理1. **分布式协调与选举**2. **ISR、OSR与HW机制**3. **高性能存储设计**4. **刷盘机制 (Flush)**5. **消息压缩算法**二、高可用与消息可靠性保障1. **数据高可用策略**2. **消息丢失场景与规避**3. **顺序消费保证**三、Kafka高频面试题精析1. …

【教学类】20250605立体纸盘(3边形-22边形,角度5、10……40,45)

背景需求 在《自助餐》活动中, 【教学类-53-01】20240918自助餐餐盘-CSDN博客文章浏览阅读984次,点赞29次,收藏11次。【教学类-53-01】20240918自助餐餐盘https://blog.csdn.net/reasonsummer/article/details/142340542?spm1011.2415.300…

GC1809:高性能24bit/192kHz音频接收芯片解析

1. 芯片概述 GC1809 是数字音频接收芯片,支持IEC60958、S/PDIF、AES3等协议,集成8选1输入切换、低抖动时钟恢复和24bit DAC,适用于家庭影院、汽车音响等高保真场景。 核心特性 高精度:24bit分辨率,动态范围105dB&…

Next.js 中间件鉴权绕过漏洞 CVE-2025-29927

前言:CVE-2025-29927 是一个影响 Next.js 的严重漏洞&#xff0c;源于开发者信任了客户端请求中携带的 X-Middleware-Rewrite 头部字段。攻击者可以手动构造该头部&#xff0c;实现绕过中间件逻辑&#xff0c;访问本应受保护的资源或 API。 影响版本&#xff1a;Next.js < …