PyTorch冻结层
PyTorch中,固定某些层,只更新部分层的参数,找到这样的方法
for param in model.parameters():
    param.requires_grad = False
for param in model.classifier_parameters():
    param.requires_grad = True
optimizer = torch.optim.Adam(model.classifier_parameters(), lr=args.lr, weight_decay=1e-4)     
先前我的操作都没有将requires_grad 置为False,直接在optimizer里设置更新的参数,比如我只想更新分类层,就在optimizer 中填入model.classifier_parameters(),与在optimizer 中填入model.parameters() 得出的结果时不同的。因此我也就认为直接在optimizer中填入要更新的参数,其余的就自动冻结了。但是今天发现,这样的操作较为耗时,因为在网络传递的时候虽然不更新权重,但网络还是会计算权重,将requires_grad 置为False可以让网络不计算此部分的权重,从而加快网络的运算速度。在将不需要更新参数的梯度设为False之后,在optimizer里面填写的是整个模型的参数或是仅有需要更新部分的参数,与速度和准确率都没有关系。
最后一点待定,还有待实验证明。
经过实验证明,最后一点是正确的。
谢谢!写的很好,一直在犹豫二者的区别,学到了!
回复删除