我有一个关于 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)
见 here
变体 1:
import pickle
# Save
mymodel.save("mymodel.pkl") # Stores *.pkl file
# Load
mymodel = pickle.load("mymodel.pkl")
变体 2:
# Save
model.save(mymodel) # Stores *.model file
# Load
model = Doc2Vec.load(mymodel)
在 gensim.utils
中,我觉得嵌入了一个 pickle 函数:https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/utils.py
默认保存 ... 尝试: _pickle.dump(self, fname_or_handle, 协议(protocol)=pickle_protocol) ...
我的问题的目标: 我很高兴了解 1)我是否需要 pickle(为了更好的内存管理)和 2)以防万一,为什么它比加载 *.model 文件更好。
谢谢!
最佳答案
每当您使用内置的 gensim 函数 save()
存储模型时,无论文件扩展名如何,都会使用 pickle。 documentation for utils告诉我们:
class 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_any2vec.BaseWordEmbeddingsModel
,而后者又继承自 gensim.utils.SaveLoad
它提供了实际的 save()
函数。
回答您的问题:
- 是的,除非您想编写自己的函数,否则您需要 pickle 将模型存储到磁盘。使用 pickle 应该不会有问题,因为 它在标准库中。你甚至不会注意到它。
- 如果你使用 gensim
save()
您可以选择任何文件扩展名的功能:*.model、*.pkl、*.p、 *。 pickle 。保存的文件将被 pickle 。
关于memory - gensim: pickle 还是不 pickle ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50655405/