Memory 根西姆:泡菜还是不泡菜?

Memory 根西姆:泡菜还是不泡菜?,memory,model,pickle,gensim,Memory,Model,Pickle,Gensim,我有一个关于gensim的问题。我想知道在保存或加载一个模型(或多个模型)时是否建议或有必要使用pickle,正如我在GitHub上发现的脚本所做的那样 mymodel = Doc2Vec(documents, size=100, window=8, min_count=5, workers=4) mymodel.delete_temporary_training_data(keep_doctags_vectors=True, keep_inference=True) 看 变体1:

我有一个关于gensim的问题。我想知道在保存或加载一个模型(或多个模型)时是否建议或有必要使用pickle,正如我在GitHub上发现的脚本所做的那样

mymodel = Doc2Vec(documents, size=100, window=8, min_count=5, workers=4)
      mymodel.delete_temporary_training_data(keep_doctags_vectors=True, keep_inference=True)

变体1:

import pickle
# Save
mymodel.save("mymodel.pkl")  # Stores *.pkl file
# Load
mymodel = pickle.load("mymodel.pkl")
# Save
model.save(mymodel) # Stores *.model file
# Load
model = Doc2Vec.load(mymodel)
变体2:

import pickle
# Save
mymodel.save("mymodel.pkl")  # Stores *.pkl file
# Load
mymodel = pickle.load("mymodel.pkl")
# Save
model.save(mymodel) # Stores *.model file
# Load
model = Doc2Vec.load(mymodel)
gensim.utils
中,我觉得有一个pickle函数嵌入其中:

def保存 ... 尝试: _pickle.dump(self,fname\u或\u handle,protocol=pickle\u protocol)

我问题的目标: 我很高兴了解1)我是否需要pickle(用于更好的内存管理)和2)万一,为什么它比加载*.model文件更好


谢谢大家!

这取决于您的要求

当您打算在Python中使用数据并且不需要在Python版本之间进行更改时(我在使用pickle模型从Python 2移植到Python 3时遇到了一些问题),二进制格式将是一个不错的选择


如果您需要互操作性,或者此模型可用于其他项目或其他程序员,我将使用gensim的保存方法。

每当您使用内置的gensim函数
save()
存储模型时,无论文件扩展名如何,都会使用pickle。报告告诉我们:

类gensim.utils.SaveLoad

Bases: object

Class which inherit from this class have save/load functions, which un/pickle them to disk.

Warning

This uses pickle for de/serializing, so objects must not contain unpicklable attributes, such as lambda functions etc.
因此,只要模型类继承自
gensim.utils.SaveLoad
类,gensim就会使用pickle保存任何模型。在您的例子中,
gensim.models.doc2vec.doc2vec
继承自
gensim.models.base\u any2vec.basewordembeddedingsmodel
,后者又继承自
gensim.utils.SaveLoad
,后者提供实际的
save()
函数

回答您的问题:

  • 是的,您需要pickle,除非您想为其编写自己的函数 将模型存储到磁盘。使用pickle应该不会有问题,因为 它在标准库中。你甚至不会注意到
  • 如果使用gensim
    save()
    函数您可以选择任何文件扩展名:*.model、*.pkl、*.p、, *.泡菜。保存的文件将被pickle

  • 在变体1中,使用
    pickle.load
    加载保存的Doc2Vec模型失败,因为使用模型的
    save
    方法存储的文件没有readline属性。它真的对你有用吗?在变体2中,我假设a)
    mymodel
    是指向扩展名为“model”的文件的路径,而不是先前创建的Doc2Vec模型,b)
    model
    是Doc2Vec模型。这些假设正确吗?