pytorch_SAVING AND LOADING MODELS

链接

WHAT IS A STATE_DICT?

  1. 模型参数(weights and biases)都存储在model.parameters()。
  2. state_dict应该是以layer为单位进行表示(weights和biases分开),字典形式。
  3. torch.nn.Module(模型)和torch.optim(优化器)都有state_dict。
  4. state_dict的组织形式参见example。

SAVING & LOADING MODEL FOR INFERENCE

  1. save:只存储参数,灵活性最大,文件后缀(.pt或者.pth)。
  2. load:加载顺序:先初始化模型,然后加载。如果是为了验证模型,别忘了使用model.eval()使得dropout和batch normalization切换为验证模式,而不是训练模式。
  3. load_state_dict()函数的参数是一个字典,不是模型路径。

Save/Load Entire Model

  1. 调用了python的pickle模块。因为pickle不存储模型类本身,只是存储“包含了模型类的文件”的路径。所以,该方法依赖于特定的类和文件路径。
  2. 这个方法很容易出现异常。

SAVING & LOADING A GENERAL CHECKPOINT FOR INFERENCE AND/OR RESUMING TRAINING

  1. 存储/加载checkpoint,用来推断或者恢复训练。
  2. 这个不止要存储state_dict,其他信息也应该放到字典里(比如optimizer的state_dict)。
  3. 存储的文件后缀一般是.tar。
  4. 加载顺序:先初始化model和optimizer吗,然后使用load方法进行加载。
  5. 如果checkpoint是为了恢复训练,则在最后要调用model.train()方法,保证模型是处于训练的状态。

SAVING MULTIPLE MODELS IN ONE FILE

  1. 一个文件存储多个模型,方法和checkpoint类似。

WARMSTARTING MODEL USING PARAMETERS FROM A DIFFERENT MODEL

  1. 新模型的一部分load老模型,或者新模型load老模型的一部分。属于迁移学习的场景。可以加速收敛。
  2. 因为新老模型的部分key是不一致的,因此load_state_dict的strict参数要设置为false,这样可以忽略不匹配的部分。
  3. 如果要将一个layer要load另一个layer的参数,并且有的参数key不匹配的时候,可以更改state_dict的key。

SAVING & LOADING MODEL ACROSS DEVICES

  1. gpu存,cpu取。load的方法要这么调用:map_location=torch.device(‘cpu’)。
  2. gpu存,gpu取。模型最后要调用model.to(torch.device(‘cuda’))。同时注意喂给模型的训练数据也应该转化为gpu的形式,并且要覆盖转化my_tensor.to(torch.device(‘cuda’))。
  3. cpu存,gpu取。首先torch.load()的参数map_location要设置为cuda:device_id。然后调用model.to(torch.device(‘cuda’)),使得模型参数转化为CUDA tensors。我猜,之所以有这步骤,是因为model里面除了有state_dict,还有其他参数需要转化为gpu形式吧。
  4. 存储数据并行训练的模型。save方法有区别,存储的是model.module.state_dict()。这样增加了load的灵活性。

本文标题:pytorch_SAVING AND LOADING MODELS

文章作者:Alfred

发布时间:2018年12月28日 - 09:12

最后更新:2018年12月28日 - 10:12

原始链接:http://blog.hbsun.top/2018/12/28/pytorch-SAVING-AND-LOADING-MODELS/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。