微调Fine tune

网络架构

一个神经网络一般可以分为两块

  • 特征抽取将原始像素变成容易线性分割的特征
  • 线性分类器来做分类

微调:使用之前已经训练好的特征抽取模块来直接使用到现有模型上,而对于线性分类器由于标号可能发生改变而不能直接使用

训练

是一个目标数据集上的正常训练任务,但使用更强的正则化

  • 使用更小的学习率
  • 使用更小的数据迭代
    源数据集远复杂于目标数据,通常微调效果会更好

重用分类器权重

  • 源数据集可能也有目标数据中的部分标号
  • 可以使用预训练好模型分类器中对应标号对应的向量来做初始化

固定一些层

神经网络通常学习有层次的特征表示

  • 低层次的特征更加通用
  • 高层次的特征则更和数据集相关
    可以固定底部一些层的参数,不参与更新来减小模型的复杂度
  • 更强的正则

微调通过使用在大数据上得到的预训练好的模型来初始化模型权重来完成提升精度

预训练模型质量很重要

微调通常速度更快,精度更好

就是重用在大数据集上训练好的模型的特征提取模块,用来做自己模型的特征提取的初始化,用来使得相比于随机初始化有更好的效果

1. 实现

python 复制代码
%matplotlib inline
import os
import torch
import torchvision
from torch import nn
from d2l import torch as d2l
python 复制代码
# 热狗数据集来源于网络

d2l.DATA_HUB['hotdog'] = (d2l.DATA_URL + 'hotdog.zip',
                          'fba480ffa8aa7e0febbb511d181409f899b9baa5')

data_dir = d2l.download_extract('hotdog')

train_imgs = torchvision.datasets.ImageFolder(os.path.join(data_dir, 'train'))
test_imgs = torchvision.datasets.ImageFolder(os.path.join(data_dir, 'test'))
python 复制代码
# 图像的大小和纵横比各有不同

hotdogs = [train_imgs[i][0] for i in range(8)]
not_hotdogs = [train_imgs[-i - 1][0] for i in range(8)]
d2l.show_images(hotdogs + not_hotdogs, 2, 8, scale=1.4)
python 复制代码
# 数据增广

normalize = torchvision.transforms.Normalize([0.485, 0.456, 0.406], # 因为要使用imageNet上的特征提取模块,所以要对数据先进行归一化【方差,均值】
                                             [0.229, 0.224, 0.225])

train_augs = torchvision.transforms.Compose([
    torchvision.transforms.RandomResizedCrop(224),
    torchvision.transforms.RandomHorizontalFlip(),
    torchvision.transforms.ToTensor(), normalize])

test_augs = torchvision.transforms.Compose([
    torchvision.transforms.Resize(256),
    torchvision.transforms.CenterCrop(224),
    torchvision.transforms.ToTensor(), normalize])
python 复制代码
# 定义和初始化模型

pretrained_net = torchvision.models.resnet18(pretrained=True)

pretrained_net.fc # 输出Linear(in_features=512, out_features=1000, bias=True)

finetune_net = torchvision.models.resnet18(pretrained=True)
finetune_net.fc = nn.Linear(finetune_net.fc.in_features, 2) # 只对最后一层的类别改变
nn.init.xavier_uniform_(finetune_net.fc.weight)
python 复制代码
# 微调模型

def train_fine_tuning(net, learning_rate, batch_size=128, num_epochs=5,
                      param_group=True):
    train_iter = torch.utils.data.DataLoader(
        torchvision.datasets.ImageFolder(os.path.join(data_dir, 'train'),
                                         transform=train_augs),
        batch_size=batch_size, shuffle=True)
    test_iter = torch.utils.data.DataLoader(
        torchvision.datasets.ImageFolder(os.path.join(data_dir, 'test'),
                                         transform=test_augs),
        batch_size=batch_size)
    devices = d2l.try_all_gpus()
    loss = nn.CrossEntropyLoss(reduction="none")

    if param_group:
        params_1x = [
            param for name, param in net.named_parameters()
            if name not in ["fc.weight", "fc.bias"]]
        trainer = torch.optim.SGD([{
            'params': params_1x}, {
                'params': net.fc.parameters(), # 最后一层分类器的学习率提高十倍,为了使其能够更快的学习
                'lr': learning_rate * 10}], lr=learning_rate,
                                  weight_decay=0.001)
    else:
        trainer = torch.optim.SGD(net.parameters(), lr=learning_rate,
                                  weight_decay=0.001)
    d2l.train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs,
                   devices)
python 复制代码
# 使用较小的学习率

train_fine_tuning(finetune_net, 5e-5)

# 为了进行比较, 所有模型参数初始化为随机值 -》结果没有之前微调的效果好
scratch_net = torchvision.models.resnet18()
scratch_net.fc = nn.Linear(scratch_net.fc.in_features, 2)
train_fine_tuning(scratch_net, 5e-4, param_group=False)
相关推荐
想会飞的蒲公英4 小时前
PyTorch 学习率实战:从零理解衰减策略与调度器
人工智能·pytorch·python·深度学习·机器学习
John jj5 小时前
拆解 Telegram 群组频道收录市场:三类方案,一个可运行的评分模型,目前TG中文人工评分加模型评分机制——LetsTG收录“快速”、“无门槛”
大数据·后端·python·深度学习·搜索引擎·django·全文检索
又折桃枝换酒钱5 小时前
CycleChart:一个统一的基于一致性学习的双向图表理解与生成框架(翻译与解读)
人工智能·深度学习·学习
卡梅德生物科技小能手7 小时前
卡梅德生物科普 TSLP(胸腺基质淋巴细胞生成素)
经验分享·深度学习·生活
方品7 小时前
【无标题】
服务器·人工智能·深度学习·nlp
Zzj_tju7 小时前
Reasoning Models 论文精读路线:CoT、Self-Consistency、Process Supervision 与 Search
人工智能·深度学习·自然语言处理
具身新纪元7 小时前
CVPR 2026|新缺陷不断上线,如何让工业视觉检测模型不忘旧账?
人工智能·深度学习·目标检测·机器学习·计算机视觉·目标跟踪·视觉检测
手写码匠20 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
Lee_jerome1 天前
python神经网络编程入门(二十五)——IMDB 数据集预处理与词汇表构建
rnn·深度学习·词频统计·文本预处理·imdb数据集·词表构建·nlp入门
指尖的爷1 天前
RKNN转化环境搭建(rknn_toolkit2新版本)
嵌入式硬件·深度学习·物联网·目标检测