PyTorch的Optimizer训练工具的实现
torch.optim是一个实现了各种优化算法的库。大部分常用的方法得到支持,并且接口具备足够的通用性,使得未来能够集成更加复杂的方法。
使用torch.optim,必须构造一个optimizer对象。这个对象能保存当前的参数状态并且基于计算梯度更新参数。
例如:
optimizer=optim.SGD(model.parameters(),lr=0.01,momentum=0.9) optimizer=optim.Adam([var1,var2],lr=0.0001)
构造方法
Optimizer的__init__函数接收两个参数:第一个是需要被优化的参数,其形式必须是Tensor或者dict;第二个是优化选项,包括学习率、衰减率等。
被优化的参数一般是model.parameters(),当有特殊需求时可以手动写一个dict来作为输入。
例如:
optim.SGD([ {'params':model.base.parameters()}, {'params':model.classifier.parameters(),'lr':1e-3} ],lr=1e-2,momentum=0.9)
这样model.base或者说大部分的参数使用1e-2的学习率,而model.classifier的参数使用1e-3的学习率,并且0.9的momentum被用于所有的参数。
梯度控制
在进行反向传播之前,必须要用zero_grad()清空梯度。具体的方法是遍历self.param_groups中全部参数,根据grad属性做清除。
例如:
forinput,targetindataset: defclosure(): optimizer.zero_grad() output=model(input) loss=loss_fn(output,target) loss.backward() returnloss optimizer.step(closure)
调整学习率
lr_scheduler用于在训练过程中根据轮次灵活调控学习率。调整学习率的方法有很多种,但是其使用方法是大致相同的:用一个Schedule把原始Optimizer装饰上,然后再输入一些相关参数,然后用这个Schedule做step()。
比如以LambdaLR举例:
lambda1=lambdaepoch:epoch//30 lambda2=lambdaepoch:0.95**epoch scheduler=LambdaLR(optimizer,lr_lambda=[lambda1,lambda2]) forepochinrange(100): train(...) validate(...) scheduler.step()
上面用了两种优化器
优化方法
optim库中实现的算法包括Adadelta、Adagrad、Adam、基于离散张量的Adam、基于∞\infty∞范式的Adam(Adamax)、AveragedSGD、L-BFGS、RMSProp、resilientBP、基于Nesterov的SGD算法。
以SGD举例:
optimizer=torch.optim.SGD(model.parameters(),lr=0.1,momentum=0.9) optimizer.zero_grad() loss_fn(model(input),target).backward() optimizer.step()
其它方法的使用也一样:
opt_Adam=torch.optim.Adam(net_Adam.parameters(),lr=0.1,betas=(0.9,0.99) opt_RMSprop=torch.optim.RMSprop(net_RMSprop.parameters(),lr=0.1,alpha=0.9) ... ...
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。