首页 > 其他分享 >全网都在讲迁移学习,可你会写代码了吗?收藏我这个,10分钟开始你的迁移学习训练

全网都在讲迁移学习,可你会写代码了吗?收藏我这个,10分钟开始你的迁移学习训练

时间:2023-06-14 21:32:56浏览次数:32  
标签:一层 10 训练 模型 最后 学习 迁移 model



文章目录

  • 前言
  • 第一步 加载预训练模型并修改类别数
  • 第二步 选择模型所有层/最后一层进行反向传播优化
  • 探讨:如何确定模型最后一层的名字是什么
  • 方法一: 查询源代码
  • 方法二: 查询模型的子模块名字


前言

先,这里不讲迁移学习的理论,只讲实践,因为理论已经全网飞了~~,不懂得大家先去学理论,理论学了再来实操。
今天,在这里只想给大家介绍一种代码写法,适用于基于pytorch的迁移学习。

迁移学习主要用在分类模型上,把原本在ImageNet或其他数据集上训练好的模型,迁移到自己的项目上来。所以对于分类模型,我们要把模型最后一层(通常是全连接层)的输出分类类别数量改了。比如,原本在ImageNet上是分1000类,而我们的目标是分3类,就要把最后的类别数改为3。

整个过程分为两步:

第一步 加载预训练模型并修改类别数

from torchvision.models import densenet169, resnet50
import torch.nn as nn
import torch.optim as optim

### 加载模型, 并修改模型的最后一层  ####
model = densenet169(pretrained=True)
# 设定 pretrained = True 就会加载训练好的模型

# 修改模型的最后一层。不同的模型,最后一层的修改略有差异
arch = 'densenet169'
classes = 2  # 分类的数量
if 'resnet' in arch:
    # for param in model.layer4.parameters():
    model.fc = nn.Linear(2048, classes)

if 'dense' in arch:
    if '121' in arch:
        # (classifier): Linear(in_features=1024)
        model.classifier = nn.Linear(1024, classes)
    elif '169' in arch:
        # (classifier): Linear(in_features=1664)
        model.classifier = nn.Linear(1664, classes)

第二步 选择模型所有层/最后一层进行反向传播优化

迁移学习有两种模型:一种是对预训练好的模型,再次从头训练,模型的每一层都要重新优化。另一种是只重新训练模型最后一层,其余层的参数固定。第一种方法适用于大多数迁移学习,预训练好的模型是在自然图像上训练的,如果迁移到医学图像上来,那么特征之间的差异很大,这时就选择第一种,重头训练。但假如有一个任务是分别猫和狗这种自然图像,且在ImageNet这个数据集中已经包含的,那么就只优化最后一层参数即可。

####  选择模型所有层都要进行反向传播优化 还是 只优化最优一层  #####
fullretrain = True  # True: 表示所有层都要进行优化,为False: 只优化最后一层

if fullretrain:
    print("=> optimizing all layers")
    for param in model.parameters():
        param.requires_grad = True
    optimizer = optim.Adam(model.parameters(), lr=0.03, weight_decay=1e-4)
        # model.parameters(): 把模型所有参数都传进去
else:
    print("=> optimizing fc/classifier layers")
    optimizer = optim.Adam(model.module.fc.parameters(), lr=0.03, weight_decay=1e-4)
    # model.module.fc.parameters(): 只传最后一个分类层的参数进去
    # 注意: 不同模型,最后一层的名字不一样

我们从代码里面可以发现,两种方法的区别就是优化器(optimizer)接收的参数不一样,第一种方法是把模型的所有参数都传进去,第二种是只传模型最后一层的参数。

迁移学习这部分的代码就讲完了。其余的就跟平时训练模型一样的写法。
如果是做分类实验,经验来看,采用预训练的模型都比你自己从0开始训练的效果好。不信的话,可以自己对比对比。

接下来,对其中的部分细节进行进一步的探讨~~

探讨:如何确定模型最后一层的名字是什么

如上述代码里,在resnet这个模型中,它最后一层叫: fc
在Densenet模型中,最后一层叫: classifier
那我怎么知道它最后一层叫什么呢?

方法一: 查询源代码

最直接的办法就是进源代码里面去查看。

全网都在讲迁移学习,可你会写代码了吗?收藏我这个,10分钟开始你的迁移学习训练_反向传播


全网都在讲迁移学习,可你会写代码了吗?收藏我这个,10分钟开始你的迁移学习训练_反向传播_02

方法二: 查询模型的子模块名字

model = densenet169(pretrained=False)
for name in model.named_modules():
    print(name)

全网都在讲迁移学习,可你会写代码了吗?收藏我这个,10分钟开始你的迁移学习训练_迁移学习_03


这种方法不仅可以知道模型最后一层的名字。

全网都在讲迁移学习,可你会写代码了吗?收藏我这个,10分钟开始你的迁移学习训练_反向传播_04


标签:一层,10,训练,模型,最后,学习,迁移,model
From: https://blog.51cto.com/u_16159492/6481584

相关文章

  • 深度学习图像标签标注软件labelme超详细教程
    文章目录前言一、labelme是什么?二、快速安装使用1.windows安装2.linux安装3.macos安装安装成功的哑子三、界面说明四、为图像创建类标签4.1参数介绍4.1文件夹所有文件创建分类标签4.2为文件夹所有文件创建分割标签5.其他问题5.1如何快速查看分割的json文件5.2json转png前......
  • dataframe相关学习
    参考博客:https://blog.csdn.net/qq_35762038/article/details/104934725?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168674788416800184175645%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168674788416800184175645&bi......
  • Ubuntu安装Python 3.10
    更新系统的软件包列表和软件包:sudoaptupdatesudoaptupgrade安装构建Python3.10所需的依赖项:sudoaptinstallbuild-essentialzlib1g-devlibncurses5-devlibgdbm-devlibnss3-devlibssl-devlibsqlite3-devlibreadline-devlibffi-devcurllibbz2-dev下载Python3.10......
  • 利用Theano理解深度学习——Multilayer Perceptron
    一、多层感知机MLP1、MLP概述对于含有单个隐含层的多层感知机(single-hidden-layerMulti-LayerPerceptron,MLP),可以将其看成是一个特殊的Logistic回归分类器,这个特殊的Logistic回归分类器首先通过一个非线性变换(non-lineartransformation)对样本的输入进行非线性变换,然后将变......
  • 利用Theano理解深度学习——Auto Encoder
    注:本系列是基于参考文献中的内容,并对其进行整理,注释形成的一系列关于深度学习的基本理论与实践的材料,基本内容与参考文献保持一致,并对这个专题起名为“利用Theano理解深度学习”系列,若文中有任何问题欢迎咨询。本文提供PDF版本,欢迎索取。“利用Theano理解深度学习”系列分为个部分,......
  • 简单易学的机器学习算法——集成方法(Ensemble Method)
    一、集成学习方法的思想    前面介绍了一系列的算法,每个算法有不同的适用范围,例如有处理线性可分问题的,有处理线性不可分问题。在现实世界的生活中,常常会因为“集体智慧”使得问题被很容易解决,那么问题来了,在机器学习问题中,对于一个复杂的任务来说,能否将很多的机器学习算法......
  • 简单易学的机器学习算法——K-近邻算法
    一、近邻算法(NearestNeighbors)1、近邻算法的概念近邻算法(NearestNeighbors)是一种典型的非参模型,与生成方法(generalizingmethod)不同的是,在近邻算法中,通过以实例的形式存储所有的训练样本,假设有m个训练样本:此时需要存储这m个训练样本,因此,近邻算法也称为基于实例的模型......
  • 简单易学的机器学习算法——朴素贝叶斯
    一、贝叶斯定理  1、条件概率B发生的情况下,事件A发生的概率,用表示。  2、全概率公式     含义是:如果和构成样本空间的一个划分,那么事件B的概率,就等于和的概率分别乘以B对这两个事件的条件概率之和。  3、贝叶斯推断        其中称为先验概率,即......
  • 简单易学的机器学习算法——极限学习机(ELM)
    一、极限学习机的概念    极限学习机(ExtremeLearningMachine)ELM,是由黄广斌提出来的求解单隐层神经网络的算法。    ELM最大的特点是对于传统的神经网络,尤其是单隐层前馈神经网络(SLFNs),在保证学习精度的前提下比传统的学习算法速度更快。二、极限学习机的原理EL......
  • 简单易学的机器学习算法——Logistic回归
    一、Logistic回归的概述  Logistic回归是一种简单的分类算法,提到“回归”,很多人可能觉得与分类没什么关系,Logistic回归通过对数据分类边界的拟合来实现分类。而“回归”也就意味着最佳拟合。要进行最佳拟合,则需要寻找到最佳的拟合参数,一些最优化方法就可以用于最佳回归系数的确......