迁移学习的基本概念与应用

简介: 迁移学习是一种机器学习技术,旨在将从一个领域中学到的知识应用到另一个相关领域中,以解决目标任务的训练数据不足和模型训练时间过长的问题。它在计算机视觉、自然语言处理等领域中得到了广泛应用。

迁移学习是一种机器学习技术,旨在将从一个领域中学到的知识应用到另一个相关领域中,以解决目标任务的训练数据不足和模型训练时间过长的问题。它在计算机视觉、自然语言处理等领域中得到了广泛应用。本文将详细介绍迁移学习的基本概念、常见方法及其在实际应用中的具体案例。

提出问题

什么是迁移学习?

迁移学习有哪些常见方法?

如何在实际项目中应用迁移学习提高模型性能?

解决方案

迁移学习的基本概念

迁移学习(Transfer Learning)是指将一个领域中学到的模型参数、特征表示或知识应用到另一个领域,以提升目标任务的学习效果。传统机器学习和深度学习方法通常需要大量标注数据进行训练,而迁移学习通过利用预训练模型,可以在较少标注数据的情况下取得良好的性能。

迁移学习的常见方法

微调预训练模型(Fine-Tuning)

微调预训练模型是迁移学习中最常用的方法之一。首先,在大规模数据集(如ImageNet)上预训练一个深度神经网络,然后将其应用到目标任务中,通过在目标任务数据上继续训练模型,以适应新的任务需求。

特征提取(Feature Extraction)

特征提取方法是指利用预训练模型的特征提取能力,将其作为固定的特征提取器,然后在提取的特征基础上训练一个新的分类器或回归器。

域自适应(Domain Adaptation)

域自适应方法旨在解决源领域和目标领域分布差异较大的问题。通过学习一个共享的特征表示,使得在源领域和目标领域的特征分布尽可能一致,从而提升目标任务的性能。

在实际项目中应用迁移学习

使用微调预训练模型进行图像分类

以下示例展示了如何使用微调预训练的 ResNet 模型进行图像分类任务。

import torch

import torch.nn as nn

import torch.optim as optim

from torchvision import datasets, models, transforms

# 数据预处理

data_transforms = {

   'train': transforms.Compose([

       transforms.RandomResizedCrop(224),

       transforms.RandomHorizontalFlip(),

       transforms.ToTensor(),

       transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])

   ]),

   'val': transforms.Compose([

       transforms.Resize(256),

       transforms.CenterCrop(224),

       transforms.ToTensor(),

       transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])

   ]),

}

data_dir = 'data/hymenoptera_data'

image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train', 'val']}

dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=32, shuffle=True, num_workers=4) for x in ['train', 'val']}

dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}

class_names = image_datasets['train'].classes

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

# 加载预训练的 ResNet 模型

model_ft = models.resnet18(pretrained=True)

# 修改最后的全连接层以适应新的分类任务

num_ftrs = model_ft.fc.in_features

model_ft.fc = nn.Linear(num_ftrs, len(class_names))

model_ft = model_ft.to(device)

# 定义损失函数和优化器

criterion = nn.CrossEntropyLoss()

optimizer_ft = optim.SGD(model_ft.parameters(), lr=0.001, momentum=0.9)

exp_lr_scheduler = optim.lr_scheduler.StepLR(optimizer_ft, step_size=7, gamma=0.1)

# 训练和评估模型

def train_model(model, criterion, optimizer, scheduler, num_epochs=25):

   for epoch in range(num_epochs):

       print(f'Epoch {epoch}/{num_epochs - 1}')

       print('-' * 10)

       for phase in ['train', 'val']:

           if phase == 'train':

               model.train()

           else:

               model.eval()

           running_loss = 0.0

           running_corrects = 0

           for inputs, labels in dataloaders[phase]:

               inputs = inputs.to(device)

               labels = labels.to(device)

               optimizer.zero_grad()

               with torch.set_grad_enabled(phase == 'train'):

                   outputs = model(inputs)

                   _, preds = torch.max(outputs, 1)

                   loss = criterion(outputs, labels)

                   if phase == 'train':

                       loss.backward()

                       optimizer.step()

               running_loss += loss.item() * inputs.size(0)

               running_corrects += torch.sum(preds == labels.data)

           if phase == 'train':

               scheduler.step()

           epoch_loss = running_loss / dataset_sizes[phase]

           epoch_acc = running_corrects.double() / dataset_sizes[phase]

           print(f'{phase} Loss: {epoch_loss:.4f} Acc: {epoch_acc:.4f}')

       print()

   return model

model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler, num_epochs=25)

 

使用特征提取进行文本分类

以下示例展示了如何使用特征提取方法将预训练的 BERT 模型应用于文本分类任务。

from transformers import BertTokenizer, BertModel

import torch

import torch.nn as nn

import torch.optim as optim

from torch.utils.data import DataLoader, Dataset

class TextDataset(Dataset):

   def __init__(self, texts, labels, tokenizer, max_len):

       self.texts = texts

       self.labels = labels

       self.tokenizer = tokenizer

       self.max_len = max_len

   def __len__(self):

       return len(self.texts)

   def __getitem__(self, item):

       text = self.texts[item]

       label = self.labels[item]

       encoding = self.tokenizer.encode_plus(

           text,

           add_special_tokens=True,

           max_length=self.max_len,

           return_token_type_ids=False,

           padding='max_length',

           truncation=True,

           return_attention_mask=True,

           return_tensors='pt',

       )

       return {

           'text': text,

           'input_ids': encoding['input_ids'].flatten(),

           'attention_mask': encoding['attention_mask'].flatten(),

           'label': torch.tensor(label, dtype=torch.long)

       }

class TextClassifier(nn.Module):

   def __init__(self, n_classes):

       super(TextClassifier, self).__init__()

       self.bert = BertModel.from_pretrained('bert-base-uncased')

       self.drop = nn.Dropout(p=0.3)

       self.out = nn.Linear(self.bert.config.hidden_size, n_classes)

   def forward(self, input_ids, attention_mask):

       pooled_output = self.bert(

           input_ids=input_ids,

           attention_mask=attention_mask

       )[1]

       output = self.drop(pooled_output)

       return self.out(output)

# 数据准备

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

texts = ["example text 1", "example text 2"]

labels = [0, 1]

dataset = TextDataset(texts, labels, tokenizer, max_len=128)

dataloader = DataLoader(dataset, batch_size=2)

# 初始化模型

model = TextClassifier(n_classes=2)

model = model.to(device)

# 定义损失函数和优化器

criterion = nn.CrossEntropyLoss()

optimizer = optim.Adam(model.parameters(), lr=2e-5)

# 训练模型

for epoch in range(3):

   model.train()

   for batch in dataloader:

       input_ids = batch['input_ids'].to(device)

       attention_mask = batch['attention_mask'].to(device)

       labels = batch['label'].to(device)

       outputs = model(input_ids=input_ids, attention_mask=attention_mask)

       loss = criterion(outputs, labels)

       optimizer.zero_grad()

       loss.backward()

       optimizer.step()

       print(f'Epoch {epoch}, Loss: {loss.item()}')

通过上述方法,可以充分利用迁移学习的优势,在较少数据和计算资源的情况下,快速构建和优化深度学习模型。迁移学习在计算机视觉、自然语言处理等领域中具有广泛的应用前景,能够帮助开发者有效提升模型性能,实现更复杂的任务。

相关文章
|
5月前
|
机器学习/深度学习 监控 算法
基于 YOLOv8 的多车型交通车辆实时检测识别项目 [目标检测完整源码]
基于YOLOv8的多车型交通车辆实时检测系统,支持12类车辆识别,集成PyQt5图形界面,可处理图片、视频、摄像头等多源输入。具备高精度、易部署、可扩展等特点,适用于智慧交通、车流统计与AI教学实践,实现从算法到应用的完整落地。
429 20
基于 YOLOv8 的多车型交通车辆实时检测识别项目 [目标检测完整源码]
|
机器学习/深度学习 人工智能 数据挖掘
AlexNet架构解析
AlexNet是2012年ImageNet图像分类竞赛的冠军,首次将卷积神经网络CNN和深度学习用于大规模图像分类并且性能优异,在今天也具有一定的参考价值。
2005 0
AlexNet架构解析
|
机器学习/深度学习 算法 数据建模
【机器学习基础】决策树(Decision Tree)
【机器学习基础】决策树(Decision Tree)
1046 0
|
4月前
|
数据采集 人工智能 监控
别让大模型“学废了”!从数据清洗到参数调优,一次讲透微调实战
本文深入浅出讲解大模型微调(Fine-tuning):为何需要“岗前培训”,如何通过数据准备、参数调优(如LoRA)、训练监控与效果评估,让通用模型精准适配专业场景。强调“数据质量>数量”“监控胜过猜测”,助力开发者高效落地AI定制化应用。(239字)
1040 4
|
3月前
|
安全 Cloud Native Java
吃透 API 网关:从核心原理、架构选型到千万级 QPS 高性能设计实战
API网关是微服务架构的流量中枢,承担统一接入、智能路由、安全防护、流量治理、协议转换与可观测性等核心能力。它解耦客户端与后端服务,提升系统稳定性、安全性与可维护性,是云原生架构的关键基础设施。
472 1
|
7月前
|
机器学习/深度学习 算法 物联网
Mcore Bridge:迈向Megatron训练"零门槛"时代
魔搭社区推出Mcore-Bridge与Megatron-SWIFT,显著降低大模型训练门槛。支持safetensors格式、一键启动、无需权重转换,兼容MoE等架构,实现高性能与易用性统一,让Megatron训练开箱即用。
1194 10
|
3月前
|
人工智能 网络协议 数据中心
你的GPU正在“等米下锅”:RDMA如何修出一条绕过CPU的高速公路?
本文深度解析现代集群网络的底层革命:从冯·诺依曼瓶颈出发,剖析RDMA如何通过零拷贝、内核旁路与硬件卸载突破TCP/IP桎梏;直击其易用性差、连接爆炸、内存注册昂贵等痛点;并揭示Mooncake(面向LLM KV Cache的张量传输引擎)与Infinistore(万卡级分布式KV底座)如何以内存池化、拓扑感知、RC/UD混合等架构创新, bridging hardware power and software simplicity。
611 7
|
3月前
|
自然语言处理 物联网 测试技术
大模型应用:中小显存适配方案:大模型微调底座选型指标与应用实现.52
本文聚焦8G显存中小算力场景,以中文电商文案生成为例,提出大模型微调底座选型体系:围绕任务适配性、算力匹配度、生态成熟度等六大核心指标,通过“需求分析—筛选排除—打分排序—验证落地”四步流程,结合量化加载、LoRA微调与实测对比(如ChatGLM-6B vs Qwen-7B),为开发者提供可复用、可落地的精准选型方案。
459 8
|
机器学习/深度学习 算法 前端开发
集成学习(Ensemble Learning)是一种机器学习技术,它通过将多个学习器(或称为“基学习器”、“弱学习器”)的预测结果结合起来,以提高整体预测性能。
集成学习(Ensemble Learning)是一种机器学习技术,它通过将多个学习器(或称为“基学习器”、“弱学习器”)的预测结果结合起来,以提高整体预测性能。
|
机器学习/深度学习 编解码 Java
YOLO11创新改进系列:卷积,主干 注意力,C3k2融合,检测头等创新机制(已更新100+)
《YOLO11目标检测创新改进与实战案例》专栏已更新100+篇文章,涵盖注意力机制、卷积优化、检测头创新、损失与IOU优化、轻量级网络设计等多方面内容。每周更新3-10篇,提供详细代码和实战案例,帮助您掌握最新研究和实用技巧。[专栏链接](https://blog.csdn.net/shangyanaf/category_12810477.html)
YOLO11创新改进系列:卷积,主干 注意力,C3k2融合,检测头等创新机制(已更新100+)