1 基本用法

1.1 构建优化器

  • 要构建一个优化器,需要提供一个包含参数的可迭代对象来进行优化。
  • 然后,可以指定特定于优化器的选项,如学习率、权重衰减等
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
optimizer = optim.Adam([var1, var2], lr=0.0001)

1.2 按参数设置选项

  • 不是传递一个 Variable 的可迭代对象,而是传递一个字典的可迭代对象
  • 每个字典定义一个单独的参数组,并且应包含一个 params 键,包含属于该组的参数列表
optim.SGD([
    {'params': model.base.parameters(), 'lr': 1e-2},
    {'params': model.classifier.parameters()}
], lr=1e-3, momentum=0.9)
  • 对于 model.base.parameters(),设置了学习率为 1e-2【相当于覆盖了默认的1e-3】
  • 对于 model.classifier.parameters(),没有单独设置学习率,因此它会使用构造 optim.SGD 时设定的默认学习率,这里是 1e-3
  • 对于这边所有的参数,都有0.9的动量

另一个例子:

bias_params = [p for name, p in self.named_parameters() if 'bias' in name]
others = [p for name, p in self.named_parameters() if 'bias' not in name]
#把参数中的偏置和非偏置分开

optim.SGD([
    {'params': others},
    {'params': bias_params, 'weight_decay': 0}
], weight_decay=1e-2, lr=1e-2)
#为偏置项设置了 0 的 weight_decay

1.3 进行优化步骤

所有优化器都实现了一个 step() 方法,用于更新参数

optimizer.step()

这是大多数优化器支持的简化版本。一旦使用例如 backward() 计算了梯度,就可以调用该函数。

2 add_param_group

  • torch.optim.Optimizer.add_param_group 方法是一个很有用的功能,允许你在训练过程中向优化器添加新的参数组。
  • 这在微调预训练网络时特别有用,例如当你决定解冻某些层,让它们在训练过程中变得可训练,并需要被优化器管理
    • 当你开始训练时,可能有些网络层是冻结的(不更新权重)。随着训练的进行,你可能想要解冻一些层以进行微调
    • 通过使用 add_param_group 方法,可以在不重启训练和不重新创建优化器的情况下,将这些新解冻的层添加到优化器中进行优化。

参数:

param_group (dict)

这个字典指定了应该被优化的张量(Tensors),以及与该参数组相关的特定优化选项。

这些选项可以包括学习率 (lr)、动量 (momentum)、权重衰减 (weight_decay) 等

举例:

假设有一个已经训练的模型,现在在特定的epoch之后,要解冻最后几层以进行微调


# 假设model是你的模型,model.classifier是需要最后解冻的部分

optimizer = optim.SGD([param for name, param in model.named_parameters() if 'classifier' not in name], 
    lr=0.01, 
    momentum=0.9)
# 初始化优化器,先只包括除classifier之外的其他部分

# 训练模型
num_epochs = 20
for epoch in range(num_epochs):
    if epoch == 10:   
        for param in model.classifier.parameters():
            param.requires_grad = True
        # 到达第10个epoch,解冻classifier部分的参数

        
        optimizer.add_param_group({'params': model.classifier.parameters(), 
                                    'lr': 0.001})
        # 添加新的参数组到优化器

   
    for input, target in dataset:
        optimizer.zero_grad()
        output = model(input)
        loss = loss_fn(output, target)
        loss.backward()
        optimizer.step()
     # 正常的一套训练过程

3 state_dict

  • torch.optim.Optimizer.state_dict() 方法返回一个字典,描述了优化器的当前状态。
  • 这是PyTorch中模型保存和加载机制的重要组成部分,特别是在需要暂停和恢复训练过程时
  • 返回的字典包含两个主要条目:

state
  • 一个字典,保存当前优化状态。
  • 内容因不同的优化器类别而异,但有一些共同的特征。
    • 例如,状态是按参数保存的,而参数本身并不被保存。
    • 这个字典将参数ID映射到与每个参数相关的状态字典。
param_groups
  • 一个列表,包含所有参数组,每个参数组都是一个字典。
  • 每个参数组包含了特定于优化器的元数据,如学习率和权重衰减,以及该组中参数的参数ID列表
{
    "state": {
        0: {"momentum_buffer": tensor(...), ...},
        1: {"momentum_buffer": tensor(...), ...},
        2: {"momentum_buffer": tensor(...), ...},
        3: {"momentum_buffer": tensor(...), ...}
    },
    "param_groups": [
        {
            "lr": 0.01,
            "weight_decay": 0,
            ...
            "params": [0]
        },
        {
            "lr": 0.001,
            "weight_decay": 0.5,
            ...
            "params": [1, 2, 3]
        }
    ]
}

4 load_state_dict

  • torch.optim.Optimizer.load_state_dict 方法用于加载优化器的状态。这对于恢复训练过程或从先前的训练状态继续训练非常有用。
# 假设在训练过程中,我们保存了优化器的状态
saved_state_dict = optimizer.state_dict()

# 现在我们需要重新加载优化器的状态
optimizer.load_state_dict(saved_state_dict)

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部