【问题标题】:Load Doc2Vec without the docs vectors only for infer_vector仅为 infer_vector 加载不带 docs 向量的 Doc2Vec
【发布时间】:2020-04-22 14:37:26
【问题描述】:

我有很大的 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?

【问题讨论】:

  • “它要求”是什么意思? (您可以编辑问题以显示特定错误吗?)
  • @gojomo - 已更新,谢谢
  • 这些错误是什么时候出现的——运行.save()时,还是稍后运行其他代码时?是否有更多信息与这些错误一起显示,例如完整的错误堆栈?
  • @gojomo - 抱歉信息缺失

标签: gensim doc2vec


【解决方案1】:

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

也就是说,如果您使用了该方法,那么您不应该删除任何仍然是保存的一部分的边文件。如果它们是由.save() 编写的,那么它们的名称应该是.load()。它们必须与主模型文件一起保存。 (在delete_temporary_training_data() 调用之后,此类文件可能会减少,或者此类文件更小 - 但必须保留任何已写入的文件以供阅读。)

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

【讨论】:

  • 谢谢 Gordon,我已经删除了这些文件以检查主模型是否需要它们,我发现 delete_temporary_training_data 没有任何好处。
  • 手动删除model.docvecs 可能让推理工作并节省最多的内存(如果您的训练集很大) - 如果您不需要,值得一试most_similar() 结果:model.docvecs = None
  • model.infer_vector 仍然使用model.docvecs.vector_size,所以您可能想尝试model.docvecs.vectors_docs_norm = Nonemodel.docvecs.vectors_docs = None,而不是model.docvecs = None
【解决方案2】:

对于任何想要在没有文档向量的情况下加载 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 的​​文件,我不想重新训练。

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多