<强>前言强>
这篇文章算是论坛PyTorch论坛关于参数初始化和整合的总结,也是我在写代码中用的算是“最佳实践”吧。最后希望大家没事多逛逛论坛,有很多高质量的回答。
<强>参数初始化强>
参数的初始化其实就是对参数赋值。而我们需要学习的参数其实都是变量,它其实是对张量的封装,同时提供了数据,研究生等借口,这就意味着我们可以直接对这些参数进行操作赋值了。这就是PyTorch简洁高效所在。
def weight_init(米): #使用isinstance来判断m属于什么类型 如果isinstance (m, nn.Conv2d): n=m。kernel_size [0] * m。kernel_size [1] * m.out_channels m.weight.data。normal_ (0, math.sqrt (2。/n)) nn.BatchNorm2d elif isinstance(米): 中#米的重量,偏见其实都是变量,为了能学习参数以及后向传播 m.weight.data.fill_ (1) m.bias.data.zero_ ()
<强> threshold 强>
往往在加载了预训练模型的参数之后,我们需要整合模型,可以使用不同的方式整合。
<强>局部微调强>
有时候我们加载了训练模型后,只想调节最后的几层,其他层不训练。其实不训练也就意味着不进行梯度计算,PyTorch中提供的requires_grad使得对训练的控制变得非常简单。
模型=torchvision.models.resnet18 (pretrained=True) 在model.parameters参数(): 参数。requires_grad=False #替换最后的全连接层,改为训练100类 #新构造的模块的参数默认requires_grad为真实的 模型。fc=nn。线性(512、100) #只优化最后的分类层 优化器=optim.SGD (model.fc.parameters (), lr=1飞行,动量=0.9) >之前<强>全局微调强>
有时候我们需要对全局都进行整合,只不过我们希望改换过的层和其他层的学习速率不一样,这时候我们可以把其他层和新层在优化器中单独赋予不同的学习速率比。如:
ignored_params=列表(地图(id、model.fc.parameters ())) base_params=过滤器(λp: id (p) ignored_params, model.parameters ()) 优化器=torch.optim.SGD ([ {“参数”:base_params}, {“参数”:model.fc.parameters (),“lr”: 1 e - 3} ),lr=1依照,动量=0.9) >之前其中base_params使用1 e - 3来训练,model.fc.parameters使用1依照来训练,动量是二者共有的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
python PyTorch参数初始化和整合