只为 infer_vector 加载没有文档向量的 Doc2Vec

Load Doc2Vec without the docs vectors only for infer_vector

我有很大的 gensim Doc2vec 模型,我只需要在从其他来源加载训练文档向量时推断向量。 是否可以在没有大 npy 文件的情况下按原样加载它

我做到了

编辑:

from gensim.models.doc2vec import Doc2Vec
model_path = r'C:\model/model'
model = Doc2Vec.load(model_path)
model.delete_temporary_training_data(keep_doctags_vectors=False, keep_inference=True)
model.save(model_path)

删除文件(model.trainables.syn1neg.npy,model.wv.vectors.npy) 手动

model = Doc2Vec.load(model_path)

但它要求

Traceback (most recent call last):

  File "<ipython-input-5-7f868a7dbe0c>", line 1, in <module>
    model = Doc2Vec.load(model_path)

  File "C:\ProgramData\Anaconda3\envs\py\lib\site-packages\gensim\models\doc2vec.py", line 1113, in load
    return super(Doc2Vec, cls).load(*args, **kwargs)

  File "C:\ProgramData\Anaconda3\envs\py\lib\site-packages\gensim\models\base_any2vec.py", line 1244, in load
    model = super(BaseWordEmbeddingsModel, cls).load(*args, **kwargs)

  File "C:\ProgramData\Anaconda3\envs\py\lib\site-packages\gensim\models\base_any2vec.py", line 603, in load
    return super(BaseAny2VecModel, cls).load(fname_or_handle, **kwargs)

  File "C:\ProgramData\Anaconda3\envs\py\lib\site-packages\gensim\utils.py", line 427, in load
    obj._load_specials(fname, mmap, compress, subname)

  File "C:\ProgramData\Anaconda3\envs\py\lib\site-packages\gensim\utils.py", line 458, in _load_specials
    getattr(self, attrib)._load_specials(cfname, mmap, compress, subname)

  File "C:\ProgramData\Anaconda3\envs\py\lib\site-packages\gensim\utils.py", line 469, in _load_specials
    val = np.load(subname(fname, attrib), mmap_mode=mmap)

  File "C:\ProgramData\Anaconda3\envs\py\lib\site-packages\numpy\lib\npyio.py", line 428, in load
    fid = open(os_fspath(file), "rb")

FileNotFoundError: [Errno 2] No such file or directory: 'C:\model/model.trainables.syn1neg.npy'

注意: 目录中不存在那些文件, 服务器上的模型 运行 并从存储中下载模型文件 我的问题是,模型是否必须具有这些文件才能进行推理? 我想 运行 它尽可能低的内存消耗。 谢谢。

编辑: 文件 model.trainables.syn1neg.npy 是模型权重吗? 文件 model.wv.vectors.npy 是 运行 推理所必需的吗?

我不喜欢 delete_temporary_training_data() 方法。这意味着训练状态和以后使用所需的状态之间有更清晰的分离。 (推理与训练非常相似,尽管它不需要缓存的文档向量来训练文本。)

就是说,如果您使用了该方法,则不应删除仍属于保存一部分的任何副文件。如果它们是由 .save() 编写的,它们将被 .load() 按名称预期。它们必须与主模型文件一起保存。 (在 delete_temporary_training_data() 调用之后,此类文件可能会更少或更小,但必须保留任何写入的文件以供阅读。)

推理绝对需要 syn1neg 文件:它是模型的隐藏到输出权重,需要执行新的前向预测(因此也需要反向传播推理调整)。 wv.vectors 文件在默认 dm=1 模式下绝对需要,其中词向量是文档向量计算的一部分。 (它在 dm=0 模式下可能是可选的,但我不确定代码是否针对它们的缺失进行了防护 - 不是通过内存中修整,而且绝对不是针对带外删除的预期文件。 )

对于想要加载 gensim.Doc2Vec 没有文档向量进行推理的任何人,我发现这很有效:

import gensim

fname = "path/to/model.pickle"
d2v = gensim.utils.unpickle(fname)
d2v.__recursive_saveloads = ["wv"] # Would normally be ['wv', 'dv']
d2v._load_specials(fname, None, *gensim.utils.SaveLoad._adapt_by_suffix(fname))

我知道这是一个非常丑陋的 hack,但在我的例子中,文档向量最终是一个 28GB 的​​文件,我不想重新训练。