用pytorch实现预训练网络的finetune
局部微调
有时候我们加载了训练模型后,只想调节最后的几层,其他层不训练。其实不训练也就意味着不进行梯度计算,PyTorch中提供的requires_grad使得对训练的控制变得非常简单。
model = torchvision.models.resnet18(pretrained=True) for param in model.parameters(): param.requires_grad = False # 替换最后的全连接层, 改为训练100类 # 新构造的模块的参数默认requires_grad为True model.fc = nn.Linear(512, 100) # 只优化最后的分类层 optimizer = optim.SGD(model.fc.parameters(), lr=1e-2, momentum=0.9)
全局微调,不同学习率
有时候我们需要对全局都进行finetune,只不过我们希望改换过的层和其他层的学习速率不一样,这时候我们可以把其他层和新层在optimizer中单独赋予不同的学习速率。比如:
ignored_params = list(map(id, model.fc.parameters())) base_params = filter(lambda p: id(p) not in ignored_params, model.parameters()) optimizer = torch.optim.SGD([ {
'params': base_params}, {
'params': model.fc.parameters(), 'lr': 1e-2} ], lr=1e-3, momentum=0.9)
其中base_params使用1e-3来训练,model.fc.parameters使用1e-2来训练,momentum是二者共有的。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211617.html原文链接:https://javaforall.net
