图像分类模型怎么微调?用 Torchvision 更换分类头并核对验证集

用 Torchvision 的 ResNet18 预训练权重更换二分类头,在独立 train/val 目录训练并输出验证正确数。

已有一小批自有图片,要区分两类对象时,可以从预训练 ResNet18 的分类头开始微调,而不是从零训练。本文用 Torchvision 官方蚂蚁与蜜蜂数据集的目录约定说明输入、训练、验证;代码会输出每轮验证准确率,但两轮演示训练不能证明模型可投入实际业务。

准备互不重叠的 train 与 val

按 PyTorch 官方迁移学习教程准备 data/hymenoptera_data/train/ants、train/bees、val/ants 和 val/bees,各目录放对应图片。教程提供示例数据下载入口;若改用自己的图片,同样保持两类目录名一致,不把同一张或连拍近重复照片分进两边。先手工打开各目录各几张,排除错类或坏图。

图像分类模型怎么微调?用 Torchvision 更换分类头并核对验证集

更换 ResNet18 分类头并运行两轮

安装与你设备匹配的 PyTorch、Torchvision 后,将下列代码保存为 train.py。它沿用官方教程的 ImageFolder、预训练 ResNet18、model.fc 替换和训练/验证分离方法,并把轮数压低用于流程验证。

from pathlib import Path
import torch
from torch import nn, optim
from torch.utils.data import DataLoader
from torchvision import datasets, models, transforms

base = Path("data/hymenoptera_data")
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),
])
train = datasets.ImageFolder(base / "train", transform)
val = datasets.ImageFolder(base / "val", transform)
assert train.classes == val.classes, (train.classes, val.classes)
train_loader = DataLoader(train, batch_size=8, shuffle=True)
val_loader = DataLoader(val, batch_size=8, shuffle=False)

device = "cuda" if torch.cuda.is_available() else "cpu"
model = models.resnet18(weights=models.ResNet18_Weights.IMAGENET1K_V1)
model.fc = nn.Linear(model.fc.in_features, len(train.classes))
model = model.to(device)
loss_fn = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)

for epoch in range(2):
    model.train()
    for images, labels in train_loader:
        images, labels = images.to(device), labels.to(device)
        optimizer.zero_grad()
        loss = loss_fn(model(images), labels)
        loss.backward()
        optimizer.step()
    model.eval()
    correct = total = 0
    with torch.no_grad():
        for images, labels in val_loader:
            prediction = model(images.to(device)).argmax(dim=1).cpu()
            correct += int((prediction == labels).sum())
            total += len(labels)
    print(f"epoch={epoch + 1}, val_correct={correct}/{total}")

运行 python train.py,预训练权重第一次使用时可能下载。预期每轮出现 val_correct=正确数/验证图片数,具体数字取决于实际图片与环境,本文不伪造。输出只有总准确数;检查实用性还应逐类看错分图片,尤其留意背景、拍摄设备或水印泄漏类别线索。

训练不动或结果虚高怎么办

找不到目录时检查 base 路径;预训练权重下载失败时先确认网络和缓存,不能把随机初始化的模型当成预训练微调;验证集类别目录不一致会触发断言。若验证准确率异常高,查重和近重复照片是否跨集合。真正用于新场景前,需要独立测试集、足够样本和明确错误成本;本例未在用户设备上运行,也不承诺两轮训练有效。

这与手写数字小样本分类演示不同:这里是自有图片目录、Torchvision 预训练权重和独立验证集。官方资料核对于 2026 年 10 月 1 日。

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/31578.html

赞 (0)
AI小管家的头像AI小管家
自有图片怎么训练目标检测模型?用 Ultralytics YOLO 检查数据集和验证结果
上一篇 2026年10月1日 下午9:19
用豆包写短视频分镜:把30秒脚本拆成镜头、旁白和拍摄清单
下一篇 2026年10月1日 下午9:19

相关推荐

  • Claude数学建模如何从问题拆解到模型构建

    Claude数学建模的价值,不是直接生成一组看似完整的公式,而是帮助使用者把自然语言问题转换成可分析、可计算、可验证的结构。面对“如何提高效率”“如何合理分配资源”这类表述,第一步应先明确研究对象、决策目标、可用数据、限制条件和最终评价标准。

    12小时前
    200
  • claude教学:从提问到整理资料的AI使用步骤

    Claude更适合承担需要阅读、比较、归纳和改写的工作。面对一份较长的会议记录、调研材料、项目文档或多轮沟通内容,它可以帮助你提炼主题、识别章节结构、抽取关键事实,并将零散信息重新组织成摘要、提纲、表格或行动清单。它也适合用于邮件改写、报告初稿、问答整理和不同语气之间的转换。

    12小时前
    300
  • claude数学能解决哪些题型?从提问到验算的使用指南

    claude数学更适合被当作一个会解释、会追问、能协助检查的数学助手,而不是只负责吐出最终数字的计算器。它可以帮助用户读懂题意、整理已知条件、选择公式、展示推导步骤,也能根据用户提供的解答寻找计算或逻辑上的漏洞。

    12小时前
    200
  • claude教科书中的AI对话使用场景与操作步骤

    本文把“claude教科书”作为学习AI对话方法的主题表达,不把未提供的书籍章节、作者观点、官方功能或具体版本当作已知事实。真正值得掌握的,不是背下一句所谓万能提示词,而是建立一套可重复的对话流程:先明确目标,再补充背景,随后规定输出方式,最后检查结果。

    12小时前
    200
  • claude数学公式怎么用 从文字描述到规范公式的操作步骤

    使用Claude处理数学公式,关键不是直接输入“帮我写公式”,而是把题意中的变量、条件、运算关系和输出格式交代清楚。自然语言往往省略主语、范围或单位,如果这些信息没有说明,生成结果就可能在符号定义、括号范围或等号两侧的逻辑上出现偏差。

    12小时前
    200
联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部