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

如何在 PyTorch 中冻结模型权重以进行迁移学习:分步教程

一、说明

        迁移学习是一种机器学习技术,其中预先训练的模型适用于新的但类似的问题。迁移学习的关键步骤之一是能够冻结预训练模型的层,以便在训练期间仅更新网络的某些部分。当您想要保留预训练模型已经学习的特征时,冻结至关重要。在本教程中,我们将使用一个简单的示例来演示在 PyTorch 中冻结权重以进行迁移学习的过程。

二、先决条件

如果您没有安装 torch 和 torchvision 库,我们可以在终端中执行以下操作:

pip install torch torchvision 

三、导入库

让我们从 Python 代码开始。首先,我们导入本教程的库:

import torch
import torch.nn as nn
import torchvision.models as models

四、加载预训练模型

        我们将在此示例中使用预训练的 ResNet-18 模型:

# Load the pre-trained model
resnet18 = models.resnet18(pretrained=True)

五、冻结层

        要冻结图层,我们将requires_grad属性设置为False。这可以防止 PyTorch 在反向传播期间计算这些层的梯度。

# Freeze all layers
for param in resnet18.parameters():param.requires_grad = False

六、解冻一些层

        通常,为了获得最佳结果,我们会对网络中的后续层进行一些微调。我们可以这样做:

# Unfreeze last layer
for param in resnet18.fc.parameters():param.requires_grad = True

七、修改网络架构

        我们将替换最后一个全连接层,以使模型适应具有不同数量的输出类(假设有 10 个类)的新问题。此外,这使我们能够将这个预训练网络用于分类以外的其他应用,例如分割。对于分割,我们用卷积层替换最后一层。对于此示例,我们继续执行包含 10 个类别的分类任务。

# Replace last layer
num_ftrs = resnet18.fc.in_features
resnet18.fc = nn.Linear(num_ftrs, 10)

八、训练修改后的模型

        让我们定义一个简单的训练循环。出于演示目的,我们将使用随机数据。

# Create random data
inputs = torch.randn(5, 3, 224, 224)
labels = torch.randint(0, 10, (5,))# Loss and optimizer
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(resnet18.fc.parameters(), lr=0.001, momentum=0.9)# Training loop
for epoch in range(5):optimizer.zero_grad()outputs = resnet18(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()print(f'Epoch {epoch+1}/5, Loss: {loss.item()}')  

在此示例中,训练期间仅更新最后一层的权重。

九、结论

        在 PyTorch 中冻结层非常简单明了。通过将该requires_grad属性设置为False,您可以防止在训练期间更新特定层,从而使您能够有效地利用预训练模型的强大功能。

        了解如何在 PyTorch 中冻结和解冻层对于有效的迁移学习至关重要,因为它允许您利用预训练的模型来执行类似但不同的任务。通过这种简单而强大的技术,您可以在训练深度神经网络时节省时间和计算资源。

参考资料:请访问此处、Github或LinkedIn。礼萨·卡兰塔尔

http://www.lryc.cn/news/190946.html

相关文章:

  • 代码随想录算法训练营第六十二、六十三天 | 单调栈 part 2 | 503.下一个更大元素II 、42. 接雨水、84.柱状图中最大的矩形
  • c#设计模式-行为型模式 之 迭代器模式
  • SSM整合RabbitMQ,Spring4.x整合RabbitMQ
  • 【2023研电赛】商业计划书赛道上海市一等奖:基于双矢量优化谐波预测控制的MMC-PET光伏储能系统
  • minio桶命名规则
  • 【教学类-35-04】学号+姓名+班级(中3班)学号字帖(A4竖版2份 竖版长条)
  • 什么叫AI自动直播?
  • LLaMA Adapter和LLaMA Adapter V2
  • 高压放大器在软体机器人领域的应用
  • 《Linux C/C++服务器开发实践》之第4章 TCP服务器编程
  • HCIA---静态路由扩展配置
  • OCP Java17 SE Developers 复习题04
  • spark中使用flatmap报错:TypeError: ‘int‘ object is not subscriptable
  • node.js知识系列(5)-每天了解一点
  • Linux服务器(银河麒麟、CentOS 7+、CentOS 7+ 等)修改IP地址
  • Mall脚手架总结(四) —— SpringBoot整合RabbitMQ实现超时订单处理
  • python实现图像的直方图均衡化
  • 哪种烧录单片机的方法合适?
  • 安规电容总结
  • MyCat分片垂直拆分
  • MongoDB bin目录没有mongo.exe命令
  • Zookeeper分布式一致性协议ZAB源码剖析
  • 微软 AR 眼镜新专利:包含热拔插电池
  • 软件TFN 2K的分布式拒绝攻击(DDos)实战详解
  • 计算机网络第四章——网络层(末)
  • Newman基本使用
  • 左值引用右值引用
  • 学习开发一个RISC-V上的操作系统(汪辰老师) — 一次RV32I加法指令的反汇编
  • IDEA中点击New没有Java Class
  • 打造炫酷效果:用Java优雅地制作Excel迷你图