前言
PyTorch的代码中很多都有显式的参数初始化过程(默认的初始化形式是什么?),本文将对其做一个总结。
参数初始化
参数的初始化其实就是对参数进行赋值。网络中所需要学习的参数其实都是Variable
,它其实是对Tensor
的封装,同时提供了data
,grad
等接口,这就意味着我们可以直接对这些参数进行赋值操作。这就是PyTorch简洁高效所在。
PyTorch中有多种初始化方式,但是其作者所推崇的方式如下:
1 | def weight_init(m): |
Finetunning
通常在加载了预训练模型的参数之后,我们需要finetune模型,一般有以下两种方式:
局部微调
冻结其它层,只调节最后的几层。其实不训练也就意味着不进行梯度计算,PyTorch中提供的requires_grad
使得对训练的控制变得非常简单。
1 | model = torchvision.models.resnet18(pretrained=True) |
全局微调
对全局都进行finetune,但是希望该换过的层和其它层的学习率不同,这是可以把其它层和新层在optimizer
中单独赋予不同的学习率。如下:
1 | ignored_params = list(map(id, model.fc.parameters())) |
其中base_params
使用1e-3
来训练,model.fc.parameters
使用1e-2
来训练,momentum
是二者共有的。