optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr = 0.0001)
optimizer也支持为每个参数单独设置选项。若想这么做,不要直接传入Variable的iterable,而是传入dict的iterable。每一个dict都分别定 义了一组参数,并且包含一个param键,这个键对应参数的列表。其他的键应该optimizer所接受的其他参数的关键字相匹配,并且会被用于对这组参数的优化。
例如,当我们想指定每一层的学习率时,这是非常有用的:
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将会被用于所 有的参数。
所有的optimizer都实现了step()方法,这个方法会更新所有的参数。它能按两种方式来使用:
optimizer.step()
这是大多数optimizer所支持的简化版本。一旦梯度被如backward()之类的函数计算好后,我们就可以调用这个函数。
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
optimizer.step(closure)
一些优化算法例如Conjugate Gradient和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)
CLASS.torch.optim.Optimizer(params,defaults)
所有优化器的基类。
warning:
需要将参数指定为具有在运行之间一致的确定性排序的集合。不满足这些属性的对象的例子是字典值的集合和迭代器。
1、 params(iterable)-一个Torch.Tensor或dict的迭代。指定应该优化哪些张量。
2、 defaults-(dict)-一个包含优化选项默认值的字典(当参数组没有指定它们时使用)
参数 | help |
---|---|
Optimizer.add_param_group | 向优化器的param_groups添加一个参数组 |
Optimizer.load_state_dict | 加载优化器状态 |
Optimizer.state_dict | 以字典的形式返回优化器的状态 |
Optimizer.step | 执行单个优化步骤(参数更新) |
Optimizer.zero_grad | 将所有优化的torch.Tensor 的梯度设置为零 |
Adadelta | Adadelta算法 |
---|---|
Adagrad | Adagrad算法 |
Adam | Adam算法 |
AdamW | AdamW算法 |
SparseAdam | 适用于稀疏张量的Adam算法的惰性版本 |
Adamax | Adamax算法(基于无穷范数的Adam变体) |
ASGD | 平均随机梯度下降算法 |
LBFGS | L-BFGS算法 |
RMSprop | RMSprop算法 |
Rprop | 弹性反向传播算法 |
SGD | 随机梯度下降(可选动量)算法 |
学习率调整应在优化器更新后应用:
model = [Parameter(torch.randn(2,2,requires_grad=True))]
optimizer = SGD(model,0.1)
scheduler = ExponentialLR(optimizer, gamma=0.9)
for epoch in range(20):
for input, target in dataset:
optimizer.zero_grad()
output = model(input)
loss = loss_fn(output, target)
loss.backward()
optimizer.step()
scheduler.step()