Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Machine learning 如何使用模型的预训练权重在下一次迭代中初始化权重?_Machine Learning_Deep Learning_Pytorch_Torchvision - Fatal编程技术网

Machine learning 如何使用模型的预训练权重在下一次迭代中初始化权重?

Machine learning 如何使用模型的预训练权重在下一次迭代中初始化权重?,machine-learning,deep-learning,pytorch,torchvision,Machine Learning,Deep Learning,Pytorch,Torchvision,我有一个模型架构。我使用torch.save()保存了整个模型,并进行了n次迭代。我想通过使用先前保存的模型的预训练权重来运行代码的另一次迭代 编辑:我希望通过预训练模型的权重完成新迭代的权重初始化 编辑2:补充一下,我不打算恢复训练。我打算保存模型,并将其用于具有相同参数的单独培训。可以将其想象为使用保存的模型和权重等,以进行更大的跑步和更多的样本(即,一项全新的培训工作) 现在,我做了一些类似的事情: # default_lr = 5 # default_weight_decay = 0.0

我有一个模型架构。我使用
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时,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'])
除此之外,如果您使用学习率衰减策略,您可能还希望保存您的学习率、您可能希望用于检查点的最佳验证精度,以及可能影响培训的任何其他可变参数。但在大多数情况下,仅保存和加载模型权重和优化器状态就足够了


编辑:您可能还想查看以下内容,其中详细解释了在不同场景下应如何保存模型。

从您发布的代码中,我看到您只是加载了以前的模型参数,以便从停止的位置重新开始培训。这不足以正确重新开始培训。除了模型参数(权重)之外,您还需要保存和加载优化器状态,尤其是当您选择的优化器为Adam时,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将保存整个模型,因此仅使用该模型即可将权重用作起点。我的理解不对吗?是的,没错。我还为我的原始答案添加了另一个链接,这可能会进一步帮助您。谢谢您的链接。从Jadiel de Armas的答案(朝下)和他的答案的案例3来看,如果所有参数都相同,我的答案是否正确?i、 e.如果我的参数相同,我假设
torch.save
将保存所有内容,包括架构、权重等,我可以简单地将模型加载为model=load(.pth model)并运行培训?我也没有使用任何学习衰退策略。只是补充一句,我不打算恢复训练。我打算保存模型,并将其用于具有相同参数的单独培训。可以将其视为使用保存的模型(带有权重等)进行更大的运行和更多的样本。是的,``torch.save()``将保存整个模型体系结构和模型的权重,您应该能够使用`torch.load()``加载模型,但请确保您不会像下面的git报告中提到的那样对网络体系结构代码进行重大更改:谢谢您的评论。我不打算为这个新的迭代更改我的优化器和学习率。简而言之,所有参数保持不变。世界只想确保它从保存的重量开始。据我所知,torch.save将保存整个模型,因此仅使用该模型即可将权重用作起点。我的理解不对吗?是的,没错。我还为我的原始答案添加了另一个链接,这可能会进一步帮助您。谢谢您的链接。从Jadiel de Armas的答案(朝下)和他的答案的案例3来看,如果所有参数都相同,我的答案是否正确?i、 e.如果我的参数相同,我假设
torch.save
将保存所有内容,包括架构、权重等,我可以简单地将模型加载为model=load(.pth model)并运行培训?我也没有使用任何学习衰退策略。只是补充一句,我不打算恢复训练。我打算保存模型,并将其用于具有相同参数的单独培训。可以将其视为使用保存的模型(带有权重等)进行更大的运行和更多的样本。是的,``torch.save()``将保存整个模型体系结构和模型的权重,您应该能够使用`torch.load()``加载模型,但只需确保您不会像以下git repo中提到的那样大幅更改网络体系结构代码: