预训练权重,顾名思义,就是预先训练好的权重,这类权重是在大型数据集上进行训练的,训练出来的权重是普遍通用的,因此不必担心是否符合自己的实际情况,我们个人往往很难训练出预训练权重的效果。并且如果不使用预训练权重的话,那么训练就会从0开始,模型没有找到好一点的感觉,它会花费相当的时间渐入佳境,这样一部份时间是我们不希望看到的,因此在进行训练自己的模型时,通常都要使用预训练模型。

能大家会有疑问,预训练权重是针对他们数据集训练得到的,如果是训练自己的数据集还能用吗?预训练权重对于不同的数据集是通用的,因为特征是通用的。一般来讲,从0开始训练效果会很差,因为权值太过随机,特征提取效果不明显。对于目标检测模型来说,一般不从0开始训练,至少会使用主干部分的权值,虽然有些论文提到了可以不用预训练,但这主要是因为他们的数据集比较大而且他们的调参能力很强。如果从0开始训练,网络在前几个epoch的Loss可能会非常大,并且多次训练得到的训练结果可能相差很大,因为权重初始化太过随机。

网络训练的过程中, 容易出现梯度消失(梯度特别的接近0)和梯度爆炸(梯度特别的大)的情况,导致大部分反向传播得到的梯度不起作用或者起反作用. 研究人员希望能够有一种好的权重初始化方法: 让网络前向传播或者反向传播的时候, 卷积的输出和前传的梯度比较稳定. 合理的方差既保证了数值一定的不同, 又保证了数值一定的稳定.(通过卷积权重的合理初始化, 让计算过程中的数值分布稳定)

冻结训练
       冻结训练其实也是迁移学习的思想,在目标检测任务中用得十分广泛。因为目标检测模型里,主干特征提取部分所提取到的特征是通用的,把backbone冻结起来训练可以加快训练效率,也可以防止权值被破坏。在冻结阶段,模型的主干被冻结了,特征提取网络不发生改变,占用的显存较小,仅对网络进行微调。在解冻阶段,模型的主干不被冻结了,特征提取网络会发生改变,占用的显存较大,网络所有的参数都会发生改变。举个例子,如果在解冻阶段设置batch_size为4,那么在冻结阶段有可能可以把batch_size设置到8。

断点恢复
       在上面冻结训练和解冻训练的代码里设置了不同的batch_size,前者是8后者是4,有可能冻结训练的时候显存是够用的,结果解冻后显存不足了,这个时候需要重新把解冻训练阶段的batch_size调得更小一点。但是网络才训练了冻结阶段的50个epoch,backbone参数还是用的预训练权重呢,网络效果肯定不够好。难道要前功尽弃重新开始训练?这时候就要使用断点恢复技术了。其实断点恢复的思想很简单,就是把网络初始设置的model_path改为出错前保存好的权值文件,然后调整一下起始epoch和终止epoch即可,比如在前面提到的这种情况里,在第51个epoch报了错,那么可以把model_path修改为第50个epoch训练结束后保存的权值文件,然后把起始epoch调整成50就可以了。

断点恢复的应用范围非常非常广。最常见的情况就是代码跑到一半因为某些原因中断了(比如电脑突然死机重启这种不可抗力因素),又不想从头重新跑,那么就可以利用断点恢复训练的方法,这样可以节省不少时间。再比如,一个非常常见的情况,假如一开始设置了100个epoch,结果模型训练结束时,Loss还呈现下降的趋势,也就是模型还没有收敛,这种现象有可能就是epoch设置小了,所以可以把第100个epoch训练得到的权值文件当做初始权值文件再训练几个epoch看看,避免重新设置epoch从头训练。

当然,想要执行断点恢复首先需要把每个epoch得到的权值文件保存起来,这样才能修改model_path重新加载。断点恢复和常规的模型保存加载的区别其实就是epoch也要修改一下而已。保存权重可以用以下方法:

torch.save(model.state_dict(), "你要保存到的路径")

预训练和微调
       假如我们现在要搭建一个网络模型来完成一个图像分类的任务,首先我们需要把网络的参数进行初始化,然后在训练网络的过程中不断对参数进行调整,直到网络的损失越来越小。在训练过程中,一开始初始化的参数会不断变化,如果结果已经满意了,那我们就可以把训练好的模型参数保存下来,以便训练好的模型可以在下次执行类似任务的时候获得比较好的效果。这个过程就是预训练(Pre-Training)。

假如在完成上面的模型训练后,我们又接到另一个类似的图像分类任务,这时我们就可以直接使用之前保存下来的模型参数作为这一次任务的初始化参数,然后在训练过程中依据结果不断进行修改,这个过程就是微调(Fine-Tuning)。

我们使用的神经网络越深,就需要越多的样本来进行训练,否则就很容易出现过拟合现象。比如我们想训练一个识别猫的模型,但是自己标注数据精力有限只标了100张,这时就可以考虑ImageNet数据集,可以在ImageNet上训练一个模型,然后使用该模型作为类似任务的初始化或特征提取器,这样既节省了时间和计算资源,又能很快地达到较好的效果。当然,采用预训练+微调也不是绝对有效的,上面识别猫的例子可以这样做是因为ImageNet里有猫的图像,所以可以认为是一个类似的数据集,如果是识别癌细胞的话,效果可能就不是那么好了。关于预训练和微调是有很多策略的,经验也很重要。

预训练权重到底是个啥相关推荐

  1. c++ opencv2 libtorch 读取预训练权重并进行预测 linux

    c++ opencv2 libtorch 读取预训练权重并进行预测 原文:https://oldpan.me/archives/pytorch-c-libtorch-inference 本篇使用的平台 ...

  2. Pytorch迁移学习加载部分预训练权重

    迁移学习在图像分类领域非常常见,利用在超大数据集上训练得到的网络权重,迁移到自己的数据上进行训练可以节约大量的训练时间,降低欠拟合/过拟合的风险. 如果用原生网络进行迁移学习非常简单,其核心是 mod ...

  3. pytorch载入部分预训练权重

    文章目录 前言 方法一 方法二 前言 使用迁移学习的方法训练网络往往需要载入部分已训练好的网络权重,接下来介绍两种载入预训练权重的方法,第一种比较简单,第二种方法稍微复杂但是更加灵活. 方法一 先按原 ...

  4. PyTorch载入预训练权重方法和冻结权重方法

    载入预训练权重 1. 直接载入预训练权重 简单粗暴法: pretrain_weights_path = "./resnet50.pth" net.load_state_dict(t ...

  5. PyTorch 加载预训练权重

    前言  使用PyTorch官方提供的权重或者其他第三方提供的权重对相同模型的参数进行初始化,在数据量较少的前提下,可以帮助模型更快地收敛到最优点,达到更好的效果,即迁移学习.  在大部分的迁移学习场景 ...

  6. torch编程-加载预训练权重-模型冻结-解耦-梯度不反传

    1)加载预训练权重 net = torchvision.models.resnet50(pretrained=False) # 构建模型 pretrained_model = torch.load(p ...

  7. Pytorch中更改预训练权重文件的下载位置

    目录 1. 参考链接 2. 更改方法 3. 一个小技巧 1. 参考链接 Pytorch更改预训练权重下载位置 pytorch---修改预训练模型下载路径 2. 更改方法 在线加载的预训练权重默认存放位 ...

  8. 迁移学习、载入预训练权重和冻结权重

    迁移学习就是载入别人预训练好的权重,拿别人的训练好的参数作为我们自己模型的初始化参数,再在这个基础上继续优化.比起从头开始一点一点随机初始化,让模型胡乱地找梯度最优的方向,肯定是迁移学习快啦. 目录 ...

  9. 深度学习加载预训练权重好处

    深度学习加载预训练权重好处: 在模型开始训练前,使模型参数得到一个好的初始化,对于后面的训练学习有非常大的帮助.

最新文章

  1. 学习linux之用户-文件-权限操作
  2. Linux调试分析诊断利器----strace
  3. idea中连接mysql插入成功数据 在navicat中刷新表格没有数据_第九篇 数据分析的进阶学习-SQL入门...
  4. Ant Desgin Pro 修改登录后默认导航到的位置
  5. 分布式服务框架原理与实践pdf_阿里架构师的架构探险之路:从零开始写分布式服务框架...
  6. vue项目做微信分享功能
  7. Visual Studio Code 使用Git进行版本控制
  8. 深入理解成分句法分析中的Dynamic Oracle
  9. SAStruts アクションにJSONを返すメソッドを作成してみる
  10. ACM算法竞赛入门 概述
  11. 营业执照生成_电子营业执照如何获取?
  12. 射频电路设计中的热量分析
  13. 今天属于李志-梵高先生
  14. 解决近期Windows11更新后无法上网的问题
  15. 王之泰201771010131《面向对象程序设计(java)》第十五周学习总结
  16. 计算机硬盘中有许多碎片,电脑磁盘碎片整理有什么用(需要经常清理吗)
  17. Python django 会议室管理系统
  18. 智能镜——6.屏幕显示时间日期篇
  19. nDPI – 快速入门指南
  20. yolo3+python3.6

热门文章

  1. dede taglist模板中调用自定义字段
  2. 织梦dede:memberlist增加会员级别名称
  3. 美团餐饮娱乐知识图谱——美团大脑揭秘
  4. APICloud 多端开发 | 拼团商城项目开发难点
  5. 用python画一只可爱的皮卡丘
  6. 只用200行Go代码写一个自己的区块链!
  7. 《简明python教程》笔记一
  8. 国家开放大学本科计算机基础机考2020,(2021更新)最新国家开放大学电大本科《计算机应用基础》网络课网考形考作业一及二试题答案.docx...
  9. 如何使用智能手机控制PlayStation 4
  10. 伊犁哈萨克自治州谷歌高清卫星地图下载