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),以及与该参数组相关的特定优化选项。 这些选项可以包括学习率 ( |
举例:
假设有一个已经训练的模型,现在在特定的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 |
|
param_groups |
|
{
"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)
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » pytorch 笔记:torch.optim(基类的基本操作)
发表评论 取消回复