当前位置:   article > 正文

pytorch固定参数-模型的pretrain和fine-tune_pytorch预训练冻结encoder参数微调

pytorch预训练冻结encoder参数微调

翻了很多博客和论坛,一般冻结参数都包括两步:

  1. 设置参数的属性为False,即requires_grad=False
  2. 定义优化器时过滤掉不进行梯度更新的参数,一般都是这样
optimizer.SGD(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-3)

上面就不细讲了,百度大部分都是这种。


先说下我的任务:

我有一个模型由encoder和decoder组成,在预训练时固定decoder的参数,只训练encoder的参数。然后在fine-tune的时候训练所有的参数。

问题:

按照上面的方法,在重新加载模型时会报长度不一致的错误。

ValueError: loaded state dict contains a parameter group that doesn't match the size of optimizer's group

调试了半天发现我加载的模型只保存了encoder部分的参数,但是新的模型是encoder和decoder两部分的参数。所以无法将预训练的参数加载到新的模型里。

解决方法:

只设置参数的属性是True/False,不用过滤优化器中的参数,这样长度就会一致了。

而且在预训练过程中固定的参数确实没有被更新,在fine-tune的时候所有的参数都被更新了,正好符合我们要求。


附上我调式的过程:

  • 预训练:只修改属性,不过滤参数
  1. for param in model.parameters():
  2. param.requires_grad = False
  3. for param in model.encoder.parameters():
  4. param.requires_grad = True

输出两次更新的参数,可以发现确实只有encoder更新了,decoder没有被更新。

  • fine-tune:
  1. for param in model.parameters():
  2. param.requires_grad = True

同样输出两次更新的参数,可以发现decoder的参数也被更新了。over!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/101269
推荐阅读
相关标签
  

闽ICP备14008679号