已培训Gensim Word2Vec模型,但未保存

时间:2018-07-11 08:56:14

标签: gensim word2vec

我正在使用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

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

1 个答案:

答案 0 :(得分:4)

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

但是,如果您的主要兴趣是最终的词向量,则这些词向量位于.wv.vectors.npy文件中。如果它似乎是全长文件(syn1neg文件中的文件大小相同),则它可能是完整的。您所缺少的是告诉您哪个索引在哪个索引中的字典。

因此,以下可能有效:

  1. 使用相同的语料库和模型参数重复原始过程,但仅需执行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内核的数量)来实现最大的训练吞吐量。

  • 对于很大的语料,可以使sample参数更具攻击性-例如1e-041e-05而不是默认的1e-03 –通过避免对最频繁单词的过多冗余训练,可以提高的向量质量。

祝你好运!