gensim:泡菜还是不泡菜?

gensim: pickle or not?

我有一个与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(自我,fname_or_handle,协议=pickle_protocol) ...

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

谢谢!

这取决于您的要求。

当您要将数据与 Python 一起使用并且不需要在 python 版本之间切换时(我在从 python 2 移植到 python3 使用 pickled 模型)二进制格式将是一个不错的选择。

如果你想要互操作性或者这个模型可以被其他项目或其他程序员使用,我会使用 gensim 的保存方法。

每当您使用内置的 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.

所以只要模型class继承自gensim.utils.SaveLoadclass,gensim就会使用pickle来保存任何模型。在您的情况下,gensim.models.doc2vec.Doc2Vec 继承自 gensim.models.base_any2vec.BaseWordEmbeddingsModel,后者又继承自 gensim.utils.SaveLoad,后者提供了实际的 save() 功能。

回答您的问题:

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