我有一个模型架构。我已经使用 torch.save()
保存了模型的整个 n 次迭代。现在我想通过使用之前保存的预训练模型的权重来运行代码的另一轮迭代。
编辑:我希望新一轮迭代的权重初始化是从预训练模型的权重开始的
编辑 2:补充说明,我不打算恢复训练。我打算保存模型,并在相同的参数下用于另一场独立的训练。可以把它想象成使用一个保存的模型及其权重等进行更大规模的运行和更多的样本(即一个全新的训练任务)
目前,我做的事情类似于:
# default_lr = 5# default_weight_decay = 0.001# model_io = 预训练模型 model = torch.load(model_io) optim = torch.optim.Adam(model.parameters(),lr=default_lr, weight_decay=default_weight_decay) loss_new = BCELoss() epochs = default_epoch ..training_loop():....outputs = model(input).....#测试循环类似
我是不是漏掉了什么?我需要为大量样本运行非常长的轮次,所以不能等到看到结果后再去解决问题。
谢谢!
回答:
从你发布的代码来看,我发现你只是加载了之前的模型参数,以便从上次中断的地方重新开始训练。这不足以正确地重新开始你的训练。除了你的模型参数(权重)之外,你还需要保存和加载你的优化器状态,特别是当你选择的优化器是 Adam 时,它为所有权重都有速度参数,帮助衰减学习率。
为了平稳地重新开始训练,我会做以下操作:
# 保存你的模型state = { 'model': model.state_dict(), 'optimizer': optimizer.state_dict()}model_save_path = "Enter/your/model/path/here/model_name.pth"torch.save(state, model_save_path)# ------------------------------------------# 加载你的模型state = torch.load(model_save_path)model = MyNetwork()model.load_state_dict(state['model'])optim = torch.optim.Adam(model.parameters(),lr=default_lr, weight_decay=default_weight_decay)optim.load_state_dict(state['optimizer'])
此外,如果你使用的是学习率衰减策略,你可能还想保存你的学习率,保存你迄今为止的最佳验证准确率,这对于检查点目的可能是有用的,以及任何其他可能影响你训练的可变参数。但在大多数情况下,仅保存和加载模型权重和优化器状态就应该足够了。
编辑:你可能还想参考以下这个回答,它详细解释了在不同情况下你应该如何保存你的模型。