1·简介
torch.optim是实现各种优化算法的包。已经支持最常用的方法,并且接口足够通用,因此将来也可以轻松集成更复杂的方法。
要使用torch.optim,必须构造一个优化器对象Optimizer,该对象将保持当前状态并根据计算出的梯度来更新参数。
要构造一个Optimizer,必须为其提供一个包含参数的可迭代项(所有参数都应为Variables)以进行优化。然后,可以指定优化器特定的选项,例如学习率,权重衰减等。
注意:如果要用.cuda()将model移动到gpu上,必须在构建optimizers之前进行移动,这因为移动后与移动前是不一样的对象。
一定要注意,在构造和使用optimizer时,应确保优化的参数位于同一位置。
例如:
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr=0.0001)
2·Per-parameter options
model的不同部分可以设定不一样的参数。
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,所有参数的momentum设置为0.9。
3·Taking an optimization step
使用optimizer.step()更新参数
这个函数在梯度被计算了之后就可以调用了,也就是执行了loss.backward()之后
示例:
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
一些优化算法(例如共轭梯度和LBFGS)需要多次重新评估函数,因此您必须传递闭包以允许它们重新计算模型。闭包应清除梯度,计算损失,然后将其返回。
示例:
for input, target in dataset:
def closure():
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
return loss
optimizer.step(closure)