PyTorch迁移学习与指南框架

news/2025/1/20 23:28:48/

前言:

在深度学习领域,迁移学习是一种强大的技术,它允许我们利用在大规模数据集上预训练的模型来解决数据规模较小的新任务。本文将详细介绍PyTorch框架中的迁移学习基本概念及其在计算机视觉(CV)开发中的应用。

一、什么是迁移学习

迁移学习(Transfer Learning)是深度学习中的一个重要概念,它主要应用于相同或相似的任务。在实际应用中,我们经常会遇到数据规模较小的情况,这使得从头开始训练一个模型变得困难。迁移学习通过重用模型的特征提取部分,然后对模型的最后几层进行微调,从而在小规模数据集上快速提升模型性能。

具体来说,迁移学习的过程可以分为以下几个步骤:

1. 特征提取(Feature Extraction):使用预训练模型在大规模数据集(如ImageNet)上学习到的特征提取层,这些层能够捕捉到图像的基本特征,如边缘、纹理等。
2. 微调(Fine-tuning):冻结预训练模型的特征提取层,只对最后几层(通常是全连接层)进行训练,使其适应新的任务和数据集。

通过迁移学习,我们可以在新的数据集上获得更高的起点,更快地达到更好的性能。如图所示,使用迁移学习的模型(绿色曲线)比不使用迁移学习的模型(蓝色曲线)具有更高的初始性能,并且随着训练的进行,其性能提升也更为显著。

 二、PyTorch中的Torchvision框架

        PyTorch提供了一个专门针对计算机视觉快速开发的框架——Torchvision。Torchvision框架的GitHub地址为:[https://github.com/pytorch/vision](https://github.com/pytorch/vision)。它主要包括以下几个部分:

1. 数据集(Datasets):提供了常用的数据集,如CIFAR10、ImageNet等,方便用户快速加载和使用。
2. 模型库(Model Zoo):包含了一系列预训练的模型,如VGG、ResNet、MobileNet、Inception等,这些模型在大规模数据集上预训练,可以直接用于特征提取或微调。
3. CV通用任务(CV General Tasks):支持图像分类、对象检测、语义分割、实例分割、人体关键点检测、视频分类等多种计算机视觉任务。

2.1 图像分类(Classification)

在图像分类任务中,我们通常使用预训练的模型作为特征提取器,然后在新的数据集上训练最后几层。例如,使用ResNet50模型进行图像分类的代码示例如下:

import torch
import torchvision.models as models
import torchvision.transforms as transforms
from torchvision.datasets import ImageFolder
from torch.utils.data import DataLoader# 加载预训练的ResNet50模型
model = models.resnet50(pretrained=True)# 冻结特征提取层
for param in model.parameters():param.requires_grad = False# 替换最后的全连接层以适应新的分类任务
num_ftrs = model.fc.in_features
model.fc = torch.nn.Linear(num_ftrs, num_classes)# 数据预处理
data_transforms = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])# 加载数据集
train_dataset = ImageFolder(root='path/to/train/dataset', transform=data_transforms)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)# 训练模型
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.fc.parameters(), lr=0.001)for epoch in range(num_epochs):model.train()for inputs, labels in train_loader:optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()
```### 2.2 对象检测(Detection)在对象检测任务中,常用的模型有Faster-RCNN、Mask-RCNN和RetinaNet。这些模型不仅能够检测图像中的对象,还能提供对象的边界框和类别。例如,使用Faster-RCNN进行对象检测的代码示例如下:```python
import torch
import torchvision.models as models
import torchvision.transforms as transforms
from torchvision.datasets import CocoDetection
from torch.utils.data import DataLoader# 加载预训练的Faster-RCNN模型
model = models.detection.fasterrcnn_resnet50_fpn(pretrained=True)# 数据预处理
data_transforms = transforms.Compose([transforms.ToTensor()
])# 加载数据集
train_dataset = CocoDetection(root='path/to/train/dataset', annFile='path/to/annotations', transform=data_transforms)
train_loader = DataLoader(train_dataset, batch_size=2, shuffle=True)# 训练模型
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)for epoch in range(num_epochs):model.train()for images, targets in train_loader:optimizer.zero_grad()loss_dict = model(images, targets)losses = sum(loss for loss in loss_dict.values())losses.backward()optimizer.step()

 2.2 语义分割(Segmentation)

在语义分割任务中,常用的模型有FCN、DeepLab和LR-ASPP。这些模型能够将图像中的每个像素分类到不同的类别中。例如,使用DeepLab进行语义分割的代码示例如下:

import torch
import torchvision.models as models
import torchvision.transforms as transforms
from torchvision.datasets import VOCSegmentation
from torch.utils.data import DataLoader# 加载预训练的DeepLab模型
model = models.segmentation.deeplabv3_resnet50(pretrained=True)# 数据预处理
data_transforms = transforms.Compose([transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])# 加载数据集
train_dataset = VOCSegmentation(root='path/to/train/dataset', image_set='train', transform=data_transforms)
train_loader = DataLoader(train_dataset, batch_size=4, shuffle=True)# 训练模型
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)for epoch in range(num_epochs):model.train()for images, targets in train_loader:optimizer.zero_grad()outputs = model(images)loss = criterion(outputs['out'], targets)loss.backward()optimizer.step()

 三、迁移学习的应用场景

迁移学习在计算机视觉领域有着广泛的应用场景,以下是一些常见的例子:

1. 图像分类:在小规模数据集上进行图像分类任务,通过迁移学习可以快速提升模型性能。
2. 对象检测:在新的数据集上进行对象检测任务,通过迁移学习可以快速适应新的对象类别。
3. 语义分割:在新的数据集上进行语义分割任务,通过迁移学习可以快速适应新的场景和对象。
4. 人体关键点检测:在新的数据集上进行人体关键点检测任务,通过迁移学习可以快速提升模型的准确性和鲁棒性。
5. 视频分类:在新的数据集上进行视频分类任务,通过迁移学习可以快速提升模型的分类性能。

四、总结

迁移学习是深度学习中的一种重要技术,它通过重用预训练模型的特征提取层,然后对最后几层进行微调,可以在小规模数据集上快速提升模型性能。PyTorch中的Torchvision框架提供了丰富的预训练模型和数据集,支持多种计算机视觉任务,如图像分类、对象检测、语义分割等。
 


http://www.ppmy.cn/news/1564777.html

相关文章

怎样应对发现的小红书笔记详情API安全风险?

及时切断风险源 暂停 API 访问权限:一旦发现安全风险,如可疑的 API 调用行为(异常高的请求频率、来自未授权 IP 地址的访问等),首先要做的是暂停可能涉及风险的 API 访问权限。如果是通过 API 密钥进行访问控制&#x…

【遥感目标检测】【数据集】DOTA:用于航空图像中目标检测的大规模数据集

DOTA:A large-scale dataset for object detection in aerial images DOTA:用于航空图像中目标检测的大规模数据集 CVPR 2018 论文地址 数据集地址 0.论文摘要 目标检测是计算机视觉中一个重要而富有挑战性的问题。尽管过去十年见证了自然场景中目标检测的重大进展…

Sass初探:嵌套只是开始,解锁Sass更多功能

文章目录 1. 安装Sass2. Sass编译成CSS3. 设置编译后的CSS格式4. Sass和Scss有什么区别?5. Sass变量的使用6. 选择器嵌套写法7. Mixin(混合)8. extend(继承)9. Sass中的模块化(import)10. Sass中的模块化(use) 1. 安装Sass 要安装 Sass,你可以根据你的开…

二、学习SpringMVC

既然是Web框架,那么当⽤⼾在浏览器中输⼊了url之后,我们的SpringMVC项⽬就可以感知到⽤⼾ 的请求,并给予响应. 咱们学习SpringMVC,重点也就是学习如何通过浏览器和⽤⼾程序进⾏交互. 主要分以下三个⽅⾯: 1. 建⽴连接:将⽤⼾(浏览器&#x…

Ei Scopus双检索 | 2025年第五届机器人与人工智能国际会议(JCRAI 2025)

会议简介 Brief Introduction 2025年第五届机器人与人工智能国际会议(JCRAI 2025) 会议时间:2025年7月11-13日 召开地点:中国银川 大会官网:www.jcrai.org 人工智能和机器人技术在过去几十年里得到了长足的发展,为未来的机器人应用…

uniapp button 去除边框

在找去除边框的办法时试了好久 css里设置了 border: none; /* 去掉边框 */outline: none; /* 确保点击时不出现轮廓 */压根不行,按钮还是浮在页面上有明显轮廓 最后看到了大佬的文章 https://www.cnblogs.com/menxiaojin/p/13752916.html button::after{border: no…

opencv_KDTree_搜索介绍及示例

cv::flann::KDTreeIndexParams 说明,使用? cv::flann::KDTreeIndexParams 是 OpenCV 中用于配置 KD 树(K-Dimensional Tree)索引参数的类。KD 树是一种用于多维空间中的点搜索的数据结构,常用于最近邻搜索等问题。在…

【2024年华为OD机试】(B卷,100分)- 比赛 (Java JS PythonC/C++)

一、问题描述 题目解析 题目描述 一个有 N 个选手参加比赛,选手编号为 1~N(3 <= N <= 100),有 M 个评委对选手进行打分(3 <= M <= 10)。每个评委对选手打分的范围为 1 到 10 分。请计算得分最多的 3 位选手的编号。如果得分相同,则得分高分值最多的选手排…