【pytorch】微调技术

前言

训练神经网络是一件非常耗费时间的事情,其需要大量的算力以及大量的数据。显然从头开始训练并不是明智之选,利用好已有的资源才是明智之选。

微调技术

图像识别笼统地可以分为两步:

  1. 提取图片的特征,此部分往往通过CNN卷积神经网络实现。
  2. 根据提取的特征,进行分类,此部分往往通过全连接神经网络来实现。
  • 识别一只猫和识别一只狗有没有类似的地方呢?
    答案是有的,它们在提取图片特征都是非常相似的。
    考虑CNN中卷积的作用,它就是在识别不同的边缘,因此无论是猫,还是狗,图片特征都是类似的,但是如何根据这些特征来学习才是关键。

预训练模型

在图像识别中,有许多经典的神经网络,例如vgg,resnet等,对于这些经典的网络,pytorch都是提供了训练模型好的模型的。这些某些都是在ImageNet上训练好的,有较高的精确度。利用训练好的某些进行图片特征的提取,就能够大大减少训练的耗时。

代码实现

import torch
from torch import nn
from torch.nn import functional as F
### 使用 PyTorch 对 ResNet 模型进行微调深度学习领域,迁移学习是一种常见的技术,通过利用预训练模型的知识来解决新问题。以下是关于如何使用 PyTorch 微调 ResNet 的详细介绍。 #### 预备工作 为了实现微调操作,首先需要准备数据集和加载预训练的 ResNet 模型。可以使用以下资源: - 数据集下载地址:`https://download.pytorch.org/tutorial/hymenoptera_data.zip`[^1]。 - ResNet-18 模型权重文件:`https://download.pytorch.org/models/resnet18-5c106cde.pth`[^2]。 #### 加载预训练模型 PyTorch 提供了一个简单的方法来加载预训练模型 `resnet18` 并对其进行修改: ```python import torch from torchvision import models # 加载预训练的 ResNet-18 模型 model = models.resnet18(pretrained=True) # 替换最后一层全连接层以适配新的分类任务 num_ftrs = model.fc.in_features model.fc = torch.nn.Linear(num_ftrs, 2) # 假设目标类别数为 2 (蚂蚁 vs 蜜蜂) ``` 上述代码中,`models.resnet18(pretrained=True)` 将自动从官方存储库下载并加载预训练权重。随后,通过替换最后的全连接层 (`fc`) 来调整网络输出维度以匹配目标任务中的类别数量。 #### 设置可训练参数 默认情况下,预训练模型的所有层都是冻结状态(即不更新梯度)。如果希望某些部分参与训练,则需手动设置这些层的 `requires_grad` 属性为 True: ```python for param in model.parameters(): param.requires_grad = False # 冻结所有层 # 解冻最后一层以便于微调 for param in model.fc.parameters(): param.requires_grad = True ``` 此方法仅允许重新训练新增加的最后一层,而保留其他层不变,从而减少计算开销并防止过拟合现象的发生[^3]。 #### 定义损失函数与优化器 接下来定义适合当前任务需求的损失函数以及相应的优化算法: ```python import torch.optim as optim from torch.nn import CrossEntropyLoss criterion = CrossEntropyLoss() # 多类别的交叉熵损失适用于分类场景 optimizer = optim.SGD(model.fc.parameters(), lr=0.001, momentum=0.9) # 只针对 fc 进行 SGD 更新 scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1) # 学习率调度策略 ``` 这里选择了随机梯度下降法作为主要优化手段,并配置了每经过一定轮次后降低学习速率的学习计划表。 #### 训练过程概览 完成以上准备工作之后就可以进入正式的训练环节,在每次迭代过程中执行前向传播、反向传播及参数更新三个基本步骤: ```python device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 判断是否有 GPU 支持加速运算 model.to(device) def train_model(dataloaders, dataset_sizes): best_acc = 0.0 for epoch in range(epochs): scheduler.step() for phase in ['train', 'val']: running_loss = 0.0 corrects = 0 for inputs, labels in dataloaders[phase]: inputs, labels = inputs.to(device), 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) corrects += torch.sum(preds == labels.data).item() epoch_loss = running_loss / dataset_sizes[phase] epoch_acc = corrects / dataset_sizes[phase] print(f'{phase} Loss: {epoch_loss:.4f}, Acc: {epoch_acc:.4f}') if phase == 'val' and epoch_acc > best_acc: best_acc = epoch_acc return model ``` 该脚本实现了完整的训练流程控制逻辑,包括验证阶段的表现评估机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值