WHAT IS A STATE_DICT?
- 模型参数(weights and biases)都存储在model.parameters()。
- state_dict应该是以layer为单位进行表示(weights和biases分开),字典形式。
- torch.nn.Module(模型)和torch.optim(优化器)都有state_dict。
- state_dict的组织形式参见example。
SAVING & LOADING MODEL FOR INFERENCE
Save/Load state_dict (Recommended)
- save:只存储参数,灵活性最大,文件后缀(.pt或者.pth)。
- load:加载顺序:先初始化模型,然后加载。如果是为了验证模型,别忘了使用model.eval()使得dropout和batch normalization切换为验证模式,而不是训练模式。
- load_state_dict()函数的参数是一个字典,不是模型路径。
Save/Load Entire Model
- 调用了python的pickle模块。因为pickle不存储模型类本身,只是存储“包含了模型类的文件”的路径。所以,该方法依赖于特定的类和文件路径。
- 这个方法很容易出现异常。
SAVING & LOADING A GENERAL CHECKPOINT FOR INFERENCE AND/OR RESUMING TRAINING
- 存储/加载checkpoint,用来推断或者恢复训练。
- 这个不止要存储state_dict,其他信息也应该放到字典里(比如optimizer的state_dict)。
- 存储的文件后缀一般是.tar。
- 加载顺序:先初始化model和optimizer吗,然后使用load方法进行加载。
- 如果checkpoint是为了恢复训练,则在最后要调用model.train()方法,保证模型是处于训练的状态。
SAVING MULTIPLE MODELS IN ONE FILE
- 一个文件存储多个模型,方法和checkpoint类似。
WARMSTARTING MODEL USING PARAMETERS FROM A DIFFERENT MODEL
- 新模型的一部分load老模型,或者新模型load老模型的一部分。属于迁移学习的场景。可以加速收敛。
- 因为新老模型的部分key是不一致的,因此load_state_dict的strict参数要设置为false,这样可以忽略不匹配的部分。
- 如果要将一个layer要load另一个layer的参数,并且有的参数key不匹配的时候,可以更改state_dict的key。
SAVING & LOADING MODEL ACROSS DEVICES
- gpu存,cpu取。load的方法要这么调用:map_location=torch.device(‘cpu’)。
- gpu存,gpu取。模型最后要调用model.to(torch.device(‘cuda’))。同时注意喂给模型的训练数据也应该转化为gpu的形式,并且要覆盖转化my_tensor.to(torch.device(‘cuda’))。
- cpu存,gpu取。首先torch.load()的参数map_location要设置为cuda:device_id。然后调用model.to(torch.device(‘cuda’)),使得模型参数转化为CUDA tensors。我猜,之所以有这步骤,是因为model里面除了有state_dict,还有其他参数需要转化为gpu形式吧。
- 存储数据并行训练的模型。save方法有区别,存储的是model.module.state_dict()。这样增加了load的灵活性。