【pytorch】torch.optim

文章目录

      • 步骤
      • 为每个参数单独设置选项
      • 进行单次优化
      • Base Class
      • 算法
      • 学习率调整

torch.optim是一个实现了各种优化算法的库。

步骤

  1. 构建一个optimizer对象。这个对象能够保持当前参数状态并基于计算得到的梯度进行参数更新。
  2. 给它一个包含了需要优化的参数(必须都是Variable对象)的iterable。
  3. 要使用.cuda()将模型移动到GPU,请在为其构建优化器之前执行此操作。.cuda()之后的模型参数将是与调用之前不同的对象。
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)

Base Class

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()

你可能感兴趣的:(pytorch入门,pytorch,python,深度学习)