033、微调

news2024/11/26 22:47:18

之——高级炼丹术

目录

之——高级炼丹术

杂谈

正文

1.标注数据集是很贵的

2.微调的思想

3.尝试

小结


杂谈

        微调(Fine-tuning)是深度学习中的一种常见策略,它通常用于预训练模型在特定任务上的性能提升。微调的过程涉及在一个已经在大规模数据上进行了预训练的模型的基础上,通过使用目标任务的相关数据集进行进一步训练。

        一般的微调步骤如下:

  1. 预训练阶段: 在大规模的数据集上,使用一个深度学习模型进行预训练。这个数据集通常是非常庞大的,例如ImageNet包含数百万张图像。

  2. 微调阶段: 将预训练的模型应用于特定的任务,使用与该任务相关的小型数据集进行微调。这个小型数据集可能是与任务密切相关的领域或者任务本身的数据。

  3. 模型调整: 在微调阶段,可以调整模型的一些超参数,如学习率、优化器等,以适应特定任务的要求。

        微调的一个常见应用是使用在大规模图像分类任务上预训练的模型,然后在较小的数据集上微调以进行特定任务,比如医学图像分类或自定义的图像分类任务。应用迁移学习(transfer learning)将从源数据集学到的知识迁移到目标数据集


正文

1.标注数据集是很贵的

        大的公开数据集花销很大,而且强调泛化性,并不强调特定任务,而自己实际情况下的任务需求一般来说没有这么大的数据集,所以我们一般使用在公开数据集上预训练的模型拓展到我们自己的任务需求上。


2.微调的思想

  1. 在源数据集(例如ImageNet数据集)上预训练神经网络模型,即源模型

  2. 创建一个新的神经网络模型,即目标模型。这将复制源模型上的所有模型设计及其参数(输出层除外)。我们假定这些模型参数包含从源数据集中学到的知识,这些知识也将适用于目标数据集。我们还假设源模型的输出层与源数据集的标签密切相关;因此不在目标模型中使用该层。

  3. 向目标模型添加输出层,其输出数是目标数据集中的类别数。然后随机初始化该层的模型参数。

  4. 在目标数据集(如椅子数据集)上训练目标模型。输出层将从头开始进行训练,而所有其他层的参数将根据源模型的参数进行微调

        训练:

         一些技巧:

        神经网络越接近度量层输出层越是与数据集相关,而底层的则更加通用,固定底层的一些细节去优化语义是更有效率的选择,因为底层的通用特征是通过大数据集预训练出来的,是有很高质量的。


3.尝试

        下载数据集并查看:

import os
import torch
import torchvision
from torch import nn
from d2l import torch as d2l

#下载hotdog数据集
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'))


#展示
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)

        数据增广:

#数据增广
# 使用RGB通道的均值和标准差,以标准化每个通道
# imagenet做了这个事情,所以等搬过来,参数来自imagenet
normalize = torchvision.transforms.Normalize(
    [0.485, 0.456, 0.406], [0.229, 0.224, 0.225])

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

test_augs = torchvision.transforms.Compose([
    torchvision.transforms.Resize([256, 256]),
    torchvision.transforms.CenterCrop(224),
    torchvision.transforms.ToTensor(),
    normalize])

        导入预训练数据集,修改输出层:

#%%
#查看预训练好的模型
pretrained_net = torchvision.models.resnet18(pretrained=True)

pretrained_net.fc
#%%
#由于我们的类别不一样,所以我们考虑copy预训练但改变最后的输出层
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)
finetune_net.fc

         训练:

# 如果param_group=True,输出层中的模型参数将使用十倍的学习率
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"]]
        #别的层不变,最后一层10倍学习率
        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)


#%%
#较小的学习率,通过微调预训练获得的模型参数
train_fine_tuning(finetune_net, 5e-5)

        结果:

        有预训练的5个epoch:

        没有预训练的:

         可见明显差别。


小结

  • 迁移学习将从源数据集中学到的知识迁移到目标数据集,微调是迁移学习的常见技巧。

  • 除输出层外,目标模型从源模型中复制所有模型设计及其参数,并根据目标数据集对这些参数进行微调。但是,目标模型的输出层需要从头开始训练。

  • 通常,微调参数使用较小的学习率,而从头开始训练输出层可以使用更大的学习率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1219161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

构建自定义ChatGPT,微软推出Copilot Studio

11月16日,微软在美国西雅图举办“Microsoft Ignite 2023”全球开发者大会。本次人工智能成为重要主题,微软几乎把所有产品都集成了生成式AI功能并发布了一系列全新产品。 其中,微软重磅推出了Copilot Studio(预览版)&…

001.前置知识

1、硬件 我们知道,组成计算机的硬件主要有“主机”和“输入/输出设备”。 主机包括机箱、电源、主板、CPU(Central Processing Unit,中央处理器)、内存、显卡、声卡、网卡、 硬盘、光驱等。输入/输出设备包括显示器、键盘、鼠标…

五分钟,Docker安装kafka 3.5,kafka-map图形化管理工具

首先确保已经安装docker,如果是windows安装docker,可参考 wsl2安装docker 1、安装zk docker run -d --restartalways -e ALLOW_ANONYMOUS_LOGINyes --log-driver json-file --log-opt max-size100m --log-opt max-file2 --name zookeeper -p 2181:218…

ssm+vue的OA办公系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的OA办公系统(有报告)。Javaee项目,ssm vue前后端分离项目。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 项目介绍&a…

中心极限定理

中心极限定理是统计学中的一个基本定理,它描述了在满足一定条件的情况下,独立随机变量的均值的分布会在样本容量足够大时趋近于正态分布。中心极限定理为许多统计推断方法的合理性提供了理论基础。 中心极限定理有两种常见的表述:独立同分布…

数据库逗号分割数据查询

遇到一个A表某个字段是B表某个字段拼接而成的。 A一对多B表 即表A某个字段存了B表多个单号或者多个ID,一开始想的是要处理数据想办法分割字符串出来然后关联,百度了下没找到,但是看到PostgreSql数据库可以实现 然后尝试了下 发现可以 第一…

学习指南:如何快速上手媒体生态一致体验开发

过去开发者们在使用多媒体能力时,往往会遇到这样的问题,比如:为什么我开发的相机不如系统相机的效果好?为什么我的应用和其他的音乐一起发声了,我要怎么处理?以及我应该怎么做才能在系统的播控中心里可以看…

中文撰稿好用软件推荐TexPage(似于Overleaf)

由于本人用惯了overleaf所以找到了一个与他功相似的也同样是利用tex写文章。唯一的区别可能也就是overleaf只支持英文,而TexPage中英文都支持。关键是不花钱,好用好用好用,用起来! 平台网址:https://www.texpage.com/…

C/C++算法-----------------------双指针详解技巧及例题

双指针 基本介绍降低时间复杂度降低时间复杂度例题 验证回文串判断是否为环反转链表总结 基本介绍 双指针(two poinnters)实际上是一种算法编程里的一种思想,它更像是一种编程思想,提供看非常高的算法效率,一般来说双…

Android——gradle插件配置方式——dependencies和plugins

引言 我们知道Android studio 需要gradle插件进行构建和编译,随着AGP的升级,引入gradle插件也发生了变化。旧版本通过build.gradle文件中dependencies代码块引入,新版本通过plugins代码块引入 一、旧版本引入方式dependencies 二、新版本引入…

解决java在idea运行正常,但是打成jar包后中文乱码问题

目录 比如: 打包命令使用utf-8编码: 1.当在idea中编写的程序,运行一切正常.但是当被打成jar包时,执行的程序会中文乱码.产生问题的原因和解决方案是什么呢? 一.问题分析 分别使用idea和jar包形式打印出System中所有的jvm参数---代码如下: public static…

一文揭秘共享wifi二维码项目推广技巧!

随着无线网络的普及和移动互联网的快速发展,共享WiFi已成为人们生活中不可或缺的一部分。共享WiFi二维码项目作为一个独具创意的共享项目,将二维码推广与共享WiFi相结合,不仅可以提升品牌曝光度,还能为用户提供便捷的上网体验。那…

windows10通过L2TP VPN隧道连接到企业内网

L2TP协议通过为数据包创建一个虚拟通道,将数据从一个网络传输到另一个网络,而不用担心数据在途中被窃取或篡改。它创建一个点对点的隧道,通过封装PPP(Point-to-Point Protocol)数据包在其内部进行传输,极大…

JSON 格式的接口测试流程【Eolink Apikit】

在进行JSON格式的接口测试时,需要使用工具发送HTTP请求并获取响应。测试工具可以是单独的测试框架,如 Eolink Apikit。测试人员需要根据接口文档和测试用例编写测试脚本,然后运行测试并分析结果,以确保接口的质量和稳定性。 当我…

探索企业主要人员API在金融领域的应用

前言 随着金融科技的不断发展,企业主要人员API在金融领域的应用日益重要。本文将探讨这个话题,并介绍一些关键的应用案例。 企业主要人员API在金融领域的应用 企业人员信息API在金融行业有许多应用。其中一个应用是风险评估。金融机构可以使用API获取…

用requests库下载文件时的挂起问题:一步步诊断与解决方案

在使用 requests 库下载一个大小为125KB的文件时,用户遇到了一个问题,下载进程在代码的特定行挂起了。用户已经检查了操作系统的内存,发现大约有2GB的空闲内存可用。用户正在使用 requests 库的2、28、1版本,并寻求帮助来调试这个…

外汇天眼:什么是非农?非农数据对外汇市场的重要性!

非农数据在外汇市场中扮演着何等关键的角色? 美国非农数据,简称“非农”,具体指排除农业部门、个体户和非盈利机构雇员后的就业相关数据,是反映美国经济实际就业和整体经济状况的关键指标。该数据由美国劳工部劳动统计局每月发布…

Bumptop——3D桌面一键get

今天,博主给大家带来一款免费、炫酷的桌面真理工具——Bumptop。这是一款可使桌面变为极酷3D桌面的软件。采用极酷的3D技术,把图标立体化,同时拖拽动作也是别有动感,充满智慧,可以完全抛弃原先单调的2D和伪3D界面&…

猫罐头哪个牌子好?推荐5款猫罐头品牌排行榜!

选择猫罐头是一项非常重要的任务,绝对不能马虎对待。因为好的猫罐头不仅提供丰富的营养,充足的水分和良好的口感,还能被猫咪轻松吸收。然而,一旦选择错误,不仅无法达到这些效果,还可能产生相反的影响。 作为…