我正在使用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
这些中间结果是我可以重用还是必须重新运行整个过程?
答案 0 :(得分:4)
这些是已保存模型的一部分,但是除非主file_name
文件(Python腌制的对象)存在且完整,否则可能很难重用它们。
但是,如果您的主要兴趣是最终的词向量,则这些词向量位于.wv.vectors.npy
文件中。如果它似乎是全长文件(syn1neg
文件中的文件大小相同),则它可能是完整的。您所缺少的是告诉您哪个索引在哪个索引中的字典。
因此,以下可能有效:
使用相同的语料库和模型参数重复原始过程,但仅需执行build_vocab()
步骤。届时,新的model.wv.vocab
字典应与保存失败运行中的字典相同。
将模型保存到新文件名,而无需train()
。
确认newmodel.wv.vectors.npy
(带有随机初始化的未经训练的向量)的大小与oldmodel.wv.vectors.npy
相同,然后将旧模型文件复制到新模型的名称。
重新加载新模型,并运行一些合理性检查,以确保单词有意义。
也许,使用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-04
或1e-05
而不是默认的1e-03
–通过避免对最频繁单词的过多冗余训练,可以提高和的向量质量。
祝你好运!