如何使用模型的预训练权重来初始化下一次迭代中的权重?
How to use pretrained weights of a model for initializing the weights in next iteration?
我有一个模型架构。我已经使用 torch.save()
保存了整个模型进行了 n 次迭代。我想 运行 使用我之前保存的模型的预训练权重对我的代码进行另一次迭代。
编辑:我希望从预训练模型的权重中完成新迭代的权重初始化
编辑2:补充一下,我不打算恢复训练。我打算保存模型并将其用于具有相同参数的单独训练。可以把它想象成使用一个带有权重等的保存模型来获得更大的 运行 和更多的样本(即一个完整的新训练工作)
现在,我会做类似的事情:
# default_lr = 5
# default_weight_decay = 0.001
# model_io = the pretrained model
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)
....
.
#similarly for test loop
我错过了什么吗?我必须 运行 很长一段时间才能获得大量样本,所以不能等着看结果然后弄清楚事情。
谢谢!
从您发布的代码中,我看到您只是加载了以前的模型参数,以便从您停止的地方重新开始训练。这不足以正确重新开始训练。除了模型参数(权重)之外,您还需要保存和加载优化器状态,尤其是当您选择的优化器是 Adam 时,它的所有权重都有速度参数,有助于降低学习率。
为了顺利重启训练,我会做以下事情:
# For saving your model
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)
# ------------------------------------------
# For loading your model
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'])
除此之外,如果您正在使用学习率衰减策略,您可能还想保存您的学习率、迄今为止您可能想要用于检查点目的的最佳验证准确性,以及可能影响您的任何其他可变参数训练。但在大多数情况下,仅保存和加载模型权重和优化器状态就足够了。
编辑:您可能还想查看以下内容 ,其中详细说明了在不同情况下应如何保存模型。
我有一个模型架构。我已经使用 torch.save()
保存了整个模型进行了 n 次迭代。我想 运行 使用我之前保存的模型的预训练权重对我的代码进行另一次迭代。
编辑:我希望从预训练模型的权重中完成新迭代的权重初始化
编辑2:补充一下,我不打算恢复训练。我打算保存模型并将其用于具有相同参数的单独训练。可以把它想象成使用一个带有权重等的保存模型来获得更大的 运行 和更多的样本(即一个完整的新训练工作)
现在,我会做类似的事情:
# default_lr = 5
# default_weight_decay = 0.001
# model_io = the pretrained model
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)
....
.
#similarly for test loop
我错过了什么吗?我必须 运行 很长一段时间才能获得大量样本,所以不能等着看结果然后弄清楚事情。
谢谢!
从您发布的代码中,我看到您只是加载了以前的模型参数,以便从您停止的地方重新开始训练。这不足以正确重新开始训练。除了模型参数(权重)之外,您还需要保存和加载优化器状态,尤其是当您选择的优化器是 Adam 时,它的所有权重都有速度参数,有助于降低学习率。
为了顺利重启训练,我会做以下事情:
# For saving your model
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)
# ------------------------------------------
# For loading your model
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'])
除此之外,如果您正在使用学习率衰减策略,您可能还想保存您的学习率、迄今为止您可能想要用于检查点目的的最佳验证准确性,以及可能影响您的任何其他可变参数训练。但在大多数情况下,仅保存和加载模型权重和优化器状态就足够了。
编辑:您可能还想查看以下内容