Gensim Doc2vec 已训练,但未保存
Posted
技术标签:
【中文标题】Gensim Doc2vec 已训练,但未保存【英文标题】:Gensim Doc2vec trained, but not saved 【发布时间】:2018-07-17 08:05:51 【问题描述】:当我在大型文本语料库上训练 d2v 时,我收到了以下 3 个文件:
doc2vec.model.trainables.syn1neg.npy
doc2vec.model.vocabulary.cum_table.npy
doc2vec.model.wv.vectors.npy
Bun 最终模型尚未保存,因为磁盘上没有足够的可用空间。
OSError: 5516903000 requested and 4427726816 written
有没有办法在比所有训练时间更短的时间内使用这些文件重新保存我的模型?
提前感谢您!
【问题讨论】:
【参考方案1】:如果您的模型仍在 RAM 中,在可以运行新代码的环境(如 Jupyter 笔记本)中,您可以尝试清理空间(或附加新卷),然后再次尝试 .save()
。也就是说,您不需要重新训练,只需重新保存 RAM 中已有的内容即可。
没有保存“只是尚未保存的内容”的例程。因此,即使 确实 保存的子文件可能很有价值,如果您不顾一切地从第一次训练运行中挽救任何东西(也许通过像 my Word2Vec
answer here 这样的过程,尽管使用 @ 有点复杂) 987654324@),尝试另一个保存到同一个地方/卷将需要让那些现有的文件不碍事。 (也许您可以将它们转移到远程存储以备不时之需,但在本地删除它们以释放空间?)
如果您尝试保存以“.gz”结尾的文件名,gensim 将尝试保存所有压缩文件,这可能会有所帮助。 (不幸的是,主向量数组的压缩效果不是很好,因此仅靠这可能还不够节省。)
没有简单的方法可以在不破坏其某些功能的情况下在内存中精简已经训练的模型。 (有一些困难的方法,但前提是你确定你可以放弃完整模型可以做的事情......目前还不清楚你是否处于这种情况。)
影响模型大小的主要因素是唯一词的数量和唯一文档标签的数量。
指定更大的min_count
在训练之前会丢弃更多的低频词——而且非常低频的词通常只会伤害模型,所以这种修剪通常会同时改善三件事:更快训练、更小的模型和更高质量的下游任务结果。
如果您使用的是纯整数 doc-tags,则该模型将需要向量空间用于从 0 到您的最高数字的所有 doc-tag int。因此,即使您只训练了 2 个文档,如果它们具有 999998
和 999999
的纯整数文档标签,它仍然需要为 0 到 999,999 的 100 万个标签分配(并保存)垃圾向量。因此,在某些情况下,人们的内存/磁盘使用率因此高于预期——或者使用从0
开始的连续 ID,或者切换到基于字符串的 doc-tags,可以大大减少大小。 (但同样,这必须在训练之前选择。)
【讨论】:
不幸的是,我的模型在 RAM 中没有。关于使用 word2vec 的教程重新保存模型,我会尝试这样做,谢谢,我应该知道有什么主要区别吗?Doc2Vec
中应该有额外的特定于 docvecs 的文件,您必须考虑到这一点。在您列出的已保存的 3 个文件中,没有一个具有经过训练的 doc-vectors 的文件,因此,如果您需要这些文件,则必须重新训练 - 没有希望从您提到的 3 个文件中恢复这些文件.
您可以尝试训练一个较小的测试 Doc2Vec 模型 - 保存它,查看它的所有文件......包括那些与您拥有的 3 个类似的文件。 (如果它们不可见,则必须尝试更大的模型,仅当数组超过一定大小时才使用 bc 子文件。)尝试删除除这 3 个之外的所有文件,看看是否可以重建可用的模型。如果它适用于较小的测试模型,请在较大的模型上重复。
但实际上,唯一有效的方法是重新训练并确保您有足够的空间来保存结果。在笔记本中执行此操作将使您有更好的机会从中间过程错误中恢复,因为中间结果仍将在 RAM 中,因此您可以(例如)清除磁盘空间然后尝试另一个 save()
。跨度>
感谢您的回答,他们确实帮助我停止浪费时间尝试恢复此模型。 )) 关于在笔记本上做的非常有趣的提示,我会试试的,谢谢!以上是关于Gensim Doc2vec 已训练,但未保存的主要内容,如果未能解决你的问题,请参考以下文章
Doc2vec:gensim doc2vec模型中只有10个docvecs?
如何从 gensim 模型中的 Doc2Vec 相似度分数访问文档详细信息?