【问题标题】:Pickle EOF error while loading object加载对象时出现泡菜 EOF 错误
【发布时间】:2017-05-31 18:25:40
【问题描述】:

我保存了一个模型对象如下:

with open('bestModel_smv_3class_version2data.pickle','wb') as f:
    pickle.dump(jpsa_svm_3class.g_cv.best_estimator_,f)

现在当我尝试加载它时,它给出了一个错误

with open('bestModel_smv_3class_version2data.pickle','rb') as f:
    svm_bestModel=pickle.load(f)

错误:

EOFError                                  Traceback (most recent call last)
<ipython-input-66-df8734c64828> in <module>()
      8 
      9 with open('bestModel_smv_3class_version2data.pickle','rb') as f:
---> 10     svm_bestModel=pickle.load(f)

EOFError: Ran out of input

【问题讨论】:

  • 也许以某种方式仔细检查该文件是否正常。我会再做一次,使用一些更小、更快速的模型。上次可能出了点问题(硬盘空间、系统内存、其他崩溃)。只是为了确定:你不是在不同的版本/系统上腌制/解封,对吧?

标签: python scikit-learn pickle


【解决方案1】:

pickle 无法处理 sklearn 模型,因为它们包含 numpy 数组。改用joblib.dump,它很相似,但他们有特殊情况保存/加载大型numpy 数组。

https://pythonhosted.org/joblib/persistence.html

【讨论】:

  • 但是pickle不能存储python类对象吗?如果我的类对象有一个属性是 sklearn 模型怎么办?请看我问的这个问题,但还没有得到答案。问题是我的模型和类对象已经被腌制了。我现在需要加载它们以进一步使用它stackoverflow.com/questions/44272487/…
  • 是的python 类对象,numpy 使用的数据表示不完全是python 类对象,但有效地以CFortran 顺序存储数据数组。是否将它们封装在 python 类中并不重要,pickle 必须能够反序列化所有内容,而不仅仅是对象容器。我很抱歉成为坏消息的带来者,但您需要再次训练您的模型并使用 joblib 持久化它们,pickle 文件没有用。
  • 我不确定您是否获得了上一条评论中的链接。如您所见,它能够加载 pickle 类。然后使用加载的泡菜类,我可以在那里检索属性。但问题是加载代码只能在训练模型的笔记本中工作。尝试加载该类的其他笔记本给出错误,如 lin
  • 我不知道你之前的问题是怎么回事,也许模型不合适,因此不包含 numpy 数组,但我可以从个人经验告诉你 pickle 可以无法处理适合的sklearn 型号,请改用joblibscikit-learn.org/stable/modules/model_persistence.html
  • docs 表示 pickle 很好(这不会让我感到惊讶,因为他们可能为所有类定义了特殊的 pickle-behaviour,包括使用 numpy 自己的 array-pickle defs)并且 joblib 更专业为了表现。官方的例子也是用香草泡菜。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多