【发布时间】:2021-10-08 15:52:55
【问题描述】:
关于在 PyTorch 中微调 CNN,根据 SAVING AND LOADING MODELS:
如果您只打算保留性能最佳的模型(根据获得的验证损失),……您必须序列化 best_model_state 或使用 best_model_state = deepcopy(model.state_dict()) 否则您的 best_model_state 将在后续更新中不断更新训练迭代。因此,最终的模型状态将是过度拟合模型的状态。
但是,我做了这样的事情:
def train_model(model, ...):
...
if validation_loss improves:
delete previous best model
torch.save(model.state_dict(), best_model_path)
else:
....
...
return model
def test_model(model, best_model_path, ...):
model.load_state_dict(torch.load(best_model_path))
model.eval()
...
...
my_model = train_model(my_model, ...)
test_model(my_model, my_path, ...)
也就是说,训练阶段返回的模型是最后一个可能出现过拟合的模型(我没有使用 deepcopy)。但是由于我在训练期间保存了最佳模型,因此在测试/推理阶段我没有问题,因为我加载了最佳模型,重载了测试期间获得的最终模型。
这个解决方案有问题吗?
谢谢。
【问题讨论】: