torch之optimizer.step() 与 scheduler.step() 的用法

  首先需要明确optimzier优化器的作用, 形象地来说,优化器就是需要根据网络反向传播的梯度信息来更新网络的参数,以起到降低loss函数计算值的作用,这也是机器学习里面最一般的方法论。

1.optimizer.step()

  optimizer.step()通常用在每个mini-batch之中,可以根据具体的需求来做。只有用了optimizer.step(),模型才会更新

2.scheduler.step()

  torch.optim.lr_scheduler提供了几种方法来根据 epoch 的数量调整学习率。学习率调度应该在优化器更新后应用;例如,您应该这样编写代码:
例子:

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

  大多数学习率调度器可以称为背靠背(也称为链式调度器)。结果是每个调度器一个接一个地应用到前一个调度器获得的学习率上。
例子:

model = [Parameter(torch.randn(2, 2, requires_grad=True))]optimizer = SGD(model, 0.1)scheduler1 = ExponentialLR(optimizer, gamma=0.9)scheduler2 = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)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()scheduler1.step()scheduler2.step()