模型放进优化器注意事项
问题描述:模型权重不更新,但网络权重的grad属性值会变化
解决过程:
检查优化器的实例化代码:
# 为了模型训练稳定,将预训练部分和自己加的随机初始化的模块使用不同的学习率
# 错误写法
optimizer = torch.optim.Adam([{'params':model_stu.original_model.parameters(), 'lr':args.lr,
'params':model_stu.semantic_map.parameters(), 'lr':args.lr * 10,
'params':model_stu.second_last_lenar.parameters(), 'lr':args.lr * 10},
], weight_decay=args.weight_decay)
# 优化器的初始化一般形式
optimizer = torch.optim.Adam(model.parameters(), lr, weight_decay)
# params:可以是以一个列表或者dict,他定义了参数组的dict
class Adam(
params: _params_t,
lr: float = ...,
betas: Tuple[float, float] = ...,
eps: float = ...,
weight_decay: float = ...,
amsgrad: bool = ...
)
正确写法:应该放进一个列表,列表的元素是一个个字典,而不是列表内是一个字典
# 正确写法
# 应该放进一个列表,列表的元素是一个个字典,字典的必要key是'params'和'lr'
optimizer = torch.optim.Adam([{'params':model_stu.original_model.parameters(), 'lr':args.lr},
{'params':model_stu.semantic_map.parameters(), 'lr':args.lr * 10},
{'params':model_stu.second_last_lenar.parameters(), 'lr':args.lr * 10},
], weight_decay=args.weight_decay)