预训练权重到底是个啥

预训练权重,顾名思义,就是预先训练好的权重,这类权重是在大型数据集上进行训练的,训练出来的权重是普遍通用的,因此不必担心是否符合自己的实际情况,我们个人往往很难训练出预训练权重的效果。并且如果不使用预训练权重的话,那么训练就会从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里有猫的图像,所以可以认为是一个类似的数据集,如果是识别癌细胞的话,效果可能就不是那么好了。关于预训练和微调是有很多策略的,经验也很重要。
 

  • 48
    点赞
  • 213
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力把公司干倒闭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值