【问题标题】:Gensim Word2Vec Model trained but not savedGensim Word2Vec 模型已训练但未保存
【发布时间】:2018-07-11 08:56:14
【问题描述】:

我正在使用 gensim 并执行了以下代码(简化):

model = gensim.models.Word2Vec(...)
mode.build_vocab(sentences)
model.train(...)
model.save('file_name')

几天后我的代码完成了model.train(...)。但是,在保存过程中,我经历了:

Process finished with exit code 137 (interrupted by signal 9: SIGKILL)

我注意到生成了一些 npy 文件:

<...>.trainables.syn1neg.npy
<...>.trainables.vectors_lockf.npy
<...>.wv.vectors.npy

我可以重复使用这些中间结果还是必须重新运行整个过程?

【问题讨论】:

    标签: gensim word2vec


    【解决方案1】:

    这些是已保存模型的一部分,但除非主 file_name 文件(Python 腌制对象)存在且完整,否则它们可能难以重用。

    但是,如果您的主要兴趣是最终的词向量,那么它们位于 .wv.vectors.npy 文件中。如果它看起来是全长的(syn1neg 文件的大小相同),它可能是完整的。您缺少的是告诉您哪个单词在哪个索引中的字典。

    所以,以下可能工作:

    1. 重复原始过程,exact 相同的语料库和模型参数,但仅通过build_vocab() 步骤。此时,新的 model.wv.vocab 字典应该与失败保存运行中的字典相同。

    2. 将该模型保存为新文件名,而无需train()

    3. 确认newmodel.wv.vectors.npy(带有随机初始化的未训练向量)与oldmodel.wv.vectors.npy 大小相同,将旧模型文件复制到新模型的名称。

    4. 重新加载新模型,并运行一些健全性检查以确保单词有意义。

    5. 也许,只保留单词向量,使用类似newmodel.wv.save()newmodel.wvsave_word2vec_format()

    如果看起来完整,复活的newmodel 也可能被修补以使用旧的syn1neg 文件。它可能可以进一步训练修补后的模型(无论是否重用旧的 syn1neg)。

    另外:只有最大的语料库,或者缺少 gensim cython 优化的安装,或者没有足够 RAM 的机器(因此在训练期间进行交换),通常需要花费数天的时间进行训练。你可能跑得更快。检查:

    • 在整个训练过程中是否发生了任何虚拟内存交换?如果是这样,那么训练吞吐量将是灾难性的,您应该使用具有更多 RAM 的机器,或者更积极地使用更高的min_count 来修剪词汇/模型大小。 (较小的min_count 值意味着较大的模型、较慢的训练、仅具有几个示例的单词的质量较差的向量,并且由于来自嘈杂的稀有词的干扰,对于更频繁的单词也违反直觉地质量较差的向量。这是通常最好忽略频率最低的词。)

    • 是否显示任何关于正在使用“慢版本”(没有有效多线程的纯 Python)的警告?如果是这样,您的训练将比解决该问题时慢约 100 倍。如果优化的代码可用,则可能会在 3 到 12 之间的某个 workers 值(但永远不会大于机器 CPU 内核的数量)来实现最大训练吞吐量。

    • 1234563 通过避免对最常用词进行大量冗余过度训练,提高向量质量。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-05
      • 1970-01-01
      相关资源
      最近更新 更多