关于pytorch模型保存与调用的一种方法及一些坑。
Posted Icy Hunter
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于pytorch模型保存与调用的一种方法及一些坑。相关的知识,希望对你有一定的参考价值。
报错一:RuntimeError: Error(s) in loading state_dict for lstm_model:
Missing key(s) in state_dict: “lstm.weight_ih_l0”, “lstm.weight_hh_l0”, “lstm.bias_ih_l0”, “lstm.bias_hh_l0”, “lstm.weight_ih_l1”, “lstm.weight_hh_l1”, “lstm.bias_ih_l1”, “lstm.bias_hh_l1”, “linear.weight”, “linear.bias”.
Unexpected key(s) in state_dict: “hidden_size”, “num_layers”, “state_dict”.
看起来是有一些参数多余保存了,因为刚开始学习这方面,根本不懂要保留哪些进去,也不懂参数去哪找。那就乖乖调函数,不要自己定义了。
model_name = "lstm_model.net"
with open(model_name, 'wb') as f:
torch.save(model.state_dict(), f) # 保留模型参数即可,这样保存的模型比较小
**报错二:**Traceback (most recent call last):
File “D:/pcham/study/study-pytorch/RNN_LSTM/文本生成/LSTM_te.py”, line 214, in
new_text = sample(model, 10, top_k=5)
File “D:/pcham/study/study-pytorch/RNN_LSTM/文本生成/LSTM_te.py”, line 187, in sample
next_char, hidden_size = predict(model, new_sentence[-1], top_k=top_k, hidden_size=hidden_size)
File “D:/pcham/study/study-pytorch/RNN_LSTM/文本生成/LSTM_te.py”, line 156, in predict
model.to(device)
AttributeError: ‘_IncompatibleKeys’ object has no attribute ‘to’
找了一下发现只是因为我写成了
model = model.load_state_dict(torch.load(“lstm_model.net”))
正确写法如下
model.load_state_dict(torch.load("lstm_model.net"))
因为我们保存的是参数,那么我们只需要基于原来的模型把参数填进去就够了,至于他返回的值就别管了。
总结一下
保存模型:
model_name = "lstm_model.net" # 模型名称
with open(model_name, 'wb') as f:
torch.save(model.state_dict(), f) # 将模型参数写入文件,model即为已经实例化训练好的model
加载模型:
因为我们保存的模型参数,因此原来的刚实例化的模型我们需要将参数填进去以此作为我们能够进行预测的模型。
# model为自己构建的模型实例
model = lstm_model(vocab, hidden_size, num_layers) # 因为我们保存的模型参数,因此原来的刚实例化的模型我们需要将参数填进去以此作为我们能够进行预测的模型
model.load_state_dict(torch.load("lstm_model.net")) # 将保存好的文件中的参数载入model。
# 接下来需要预测直接调用model即可
因此这种保存的模型比较小,因为他好像只保存了模型的参数,而模型的结构需要实际调用中给他才行,这就是为什么需要加载模型之前需要实例化初始的模型的原因吧。
以上是关于关于pytorch模型保存与调用的一种方法及一些坑。的主要内容,如果未能解决你的问题,请参考以下文章