模型训练微调流程,pytorch(豆包写的

备数据 → 做预处理 → 加载模型 → 冻结骨干 → 配损失优化器 → 前向传播算损失 → 反向更新 → 验证 → 保存 → 推理 → 解冻精调

  1. 准备数据集(划分训练集 / 验证集)
  2. 数据预处理 + 数据增强
  3. 构建 / 加载模型(自建模型 或 预训练模型)
  4. 微调专属:冻结骨干网络
  5. 配置训练参数(设备、损失函数、优化器)
  6. 训练循环:前向传播 → 算损失 → 反向传播 → 更新参数
  7. 每轮验证模型准确率
  8. 保存最优模型权重
  9. 推理预测(用训练好的模型做预测)
  10. 微调进阶:解冻部分层,小学习率再训练

一、逐步骤详细讲解 + 核心代码

第 1 步:准备数据集

把数据分成两部分:

  • train 训练集:教模型学习
  • val 验证集:看模型学没学会

文件夹标准格式(CV 通用):

plaintext

复制代码
data/
  train/
    类别1/ 图片
    类别2/ 图片
  val/
    类别1/ 图片
    类别2/ 图片

第 2 步:数据预处理 + 数据加载

做三件事:

  • 缩放图片、翻转、裁剪(数据增强)
  • 归一化
  • Dataset + DataLoader 批量喂给模型

python

运行

复制代码
from torchvision import transforms, datasets
from torch.utils.data import DataLoader

# 1. 数据增强
train_transform = transforms.Compose([
    transforms.Resize((224,224)),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225])
])

# 2. 加载数据集
train_dataset = datasets.ImageFolder("data/train", transform=train_transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)

第 3 步:加载模型(两种情况)

情况 A:从零自己搭模型

python

运行

复制代码
import torch.nn as nn
class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc = nn.Linear(10, 2)
    def forward(self, x):
        return self.fc(x)

model = Net()

情况 B:微调 加载预训练模型(最常用)

python

运行

复制代码
from torchvision import models
# 加载预训练ResNet
model = models.resnet18(pretrained=True)

第 4 步:微调关键 ------ 冻结骨干网络

冻结 :让预训练的主干网络参数不更新、不被破坏,只训练自己的分类头。

python

运行

复制代码
# 冻结所有层
for param in model.parameters():
    param.requires_grad = False

# 替换最后一层分类头,适配自己的类别数
num_ftrs = model.fc.in_features
model.fc = nn.Linear(num_ftrs, 2)  # 2分类

第 5 步:配置训练必备组件

python

运行

复制代码
import torch
import torch.optim as optim

# 设备(有GPU用GPU,没GPU用CPU)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)

# 损失函数(分类必用)
loss_fn = nn.CrossEntropyLoss()

# 优化器(更新参数)
optimizer = optim.Adam(model.fc.parameters(), lr=0.001)

第 6 步:训练循环(核心)

固定四件套:

  1. 前向传播 model(x)
  2. 计算损失 loss_fn
  3. 反向传播 loss.backward()
  4. 参数更新 optimizer.step()

python

运行

复制代码
model.train()  # 切换到训练模式
for x, label in train_loader:
    x, label = x.to(device), label.to(device)

    # 1.前向传播
    out = model(x)
    # 2.算损失
    loss = loss_fn(out, label)

    # 3.梯度清零 + 反向传播 + 更新
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

第 7 步:验证模型

每训练一轮,用验证集测准确率,看模型效果:

python

运行

复制代码
model.eval()  # 推理模式,关闭dropout/BN
with torch.no_grad():  # 不计算梯度,省显存
    # 跑验证集,计算正确率
    pass

第 8 步:保存模型

保存训练好的权重,下次直接用,不用重新训练:

python

运行

复制代码
torch.save(model.state_dict(), "best_model.pth")

第 9 步:模型推理(拿来做预测)

加载模型 → 输入数据 → 出结果

python

运行

复制代码
# 加载权重
model.load_state_dict(torch.load("best_model.pth"))
model.eval()

with torch.no_grad():
    pred = model(输入数据)

第 10 步:微调进阶 ------ 解冻再训练

当分类头训练好后:

  1. 解冻骨干后面几层
  2. 更小学习率继续训练
  3. 模型效果进一步提升

python

运行

复制代码
# 解冻最后一层残差块
for param in model.layer4.parameters():
    param.requires_grad = True

# 更小学习率
optimizer = optim.Adam(model.parameters(), lr=1e-4)

二、从零训练 vs 微调 区别

1. 从零训练

  • 不用冻结网络
  • 全部参数都训练
  • 学习率正常 0.001
  • 需要大量数据

2. 模型微调(Finetune)

  • 冻结骨干,只训分类头
  • 解冻部分层,小学习率精调
  • 少量数据就能训出好效果
  • 工业项目、比赛、毕设全用这个
相关推荐
keyanbanyungong22 分钟前
告别杂乱病历!临床科研AI工具实测
人工智能·深度学习
明志数科1 小时前
工业场景数据标注跟实验室标注有什么不同
人工智能·机器学习
xiaoxiaoxiaolll1 小时前
《Light: Science & Applications》合并BIC实现80倍阈值单模运行:超紧凑光子晶体激光器新突破
人工智能·算法·机器学习
悟乙己2 小时前
因果机器学习DML效果与应用场景探索
人工智能·机器学习
z小猫不吃鱼2 小时前
13 Scaling Law 入门:模型规模、数据规模和计算量是什么关系?
人工智能·深度学习·机器学习
三无推导2 小时前
ComfyUI 安装部署教程:Windows 下快速搭建可视化 AI 绘图工作流,零基础也能跑通
人工智能·pytorch·windows·stable diffusion·aigc·ai绘画·持续部署
春日见2 小时前
5分钟入门强化学习之动态规划算法与实现
大数据·人工智能·python·算法·机器学习·计算机视觉
scx_link3 小时前
线性回归的总结:
算法·机器学习·线性回归
知识浅谈3 小时前
Transformer 中的 Q、K、V 到底是什么?怎么理解 Query、Key、Value?
人工智能·深度学习·transformer
人工智能培训4 小时前
设备故障?数字孪生提前预警
人工智能·深度学习·神经网络·机器学习·生成对抗网络