温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

pytorch如何做微调

发布时间:2026-11-05 08:21:54 来源:亿速云 阅读:103 作者:小樊 栏目:编程语言

在 PyTorch 中进行**微调(Fine-tuning)**通常指:利用在大规模数据上预训练好的模型(如 ResNet、BERT 等),在自己的任务数据上继续训练,以适应新任务。

下面从核心思路 → 常见做法 → 示例代码三部分说明。


一、微调的核心思路

  1. 加载预训练模型
  2. 修改模型头部(Head)
    • 分类数不同要改最后一层
  3. 冻结部分层(可选)
    • 底层学通用特征,通常先冻结
  4. 设置优化器与学习率
    • 微调学习率要比从头训练小
  5. 训练 & 验证

二、常见微调策略

策略 1:只训练最后几层(最常用)

  • 冻结 backbone
  • 只训练分类头

策略 2:分层学习率

  • 不同层使用不同学习率
  • 底层小,顶层大

策略 3:全部微调

  • 不冻结任何参数
  • 数据量大、任务差异大时使用

三、PyTorch 微调示例(以图像分类为例)

1. 加载预训练模型(torchvision)

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

model = models.resnet18(pretrained=True)
num_classes = 10  # 你的任务类别数

# 修改最后一层
model.fc = nn.Linear(model.fc.in_features, num_classes)

2. 冻结 backbone(只训练 fc)

for name, param in model.named_parameters():
    if "fc" not in name:
        param.requires_grad = False

3. 定义损失函数与优化器

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(
    model.fc.parameters(),
    lr=1e-3
)

4. 训练循环(简化版)

model.train()
for x, y in dataloader:
    x, y = x.to(device), y.to(device)

    optimizer.zero_grad()
    out = model(x)
    loss = criterion(out, y)
    loss.backward()
    optimizer.step()

5. 解冻并继续微调(可选)

for param in model.parameters():
    param.requires_grad = True

optimizer = torch.optim.SGD(
    model.parameters(),
    lr=1e-4,
    momentum=0.9
)

四、NLP 微调示例(HuggingFace)

from transformers import BertForSequenceClassification, AdamW

model = BertForSequenceClassification.from_pretrained(
    "bert-base-chinese",
    num_labels=2
)

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

五、微调常见建议

✅ 学习率:

  • 图像:1e-3 ~ 1e-4
  • NLP:2e-5 ~ 5e-5

✅ Batch Size 尽量大
✅ 使用预训练均值/方差做归一化
✅ 先冻结再解冻,效果更好更稳定


如果你有具体任务(CV / NLP / 语音 / 自定义模型),可以告诉我,我可以给你更针对性的微调代码模板。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手