在创建TaggedDocument时,我原本打算使用我已经为文档分配的ID。
例如:TaggedDocument(text.split(), [ID])
然而,由于ID是整数,它似乎假设集合中有那么多个"唯一"的文档:(看到的最大的ID = 14102100085)
collected 9324 word types and 14102100085 unique tags from a corpus of 13044 examples and 150972 words
estimated required memory for 9324 words and 10 dimensions: 564091276120 bytes
这导致内存溢出错误——那可是很多字节!
大多数教程似乎都使用枚举,这样你就可以得到正确的"唯一"标签数量,所以在我这样做之后,情况变得更加合理了。
collected 9324 word types and 13044 unique tags from a corpus of 13044 examples and 150972 words
estimated required memory for 9324 words and 10 dimensions: 7794480 bytes
6条答案
按热度按时间1mrurvl11#
是的,这是一个已知且故意的行为。如果你想使用原始整数作为文档标签,它们应该从0开始并且是连续的,这样它们就可以被索引到一个紧凑的numpy数组中。
这是一个优化,让能够使用这些ID的用户节省大量内存,与非连续ID(如任意字符串或稀疏整数索引)需要额外MapID到紧凑索引的替代方案相比。
你有没有建议更好地记录这种行为,或者在导致内存问题时提供更好的错误?
j2datikz2#
我认为是“unique”这个词让我困惑,所以你可能只是明确地称之为最大标签ID。当标签数量大大超过文档数量时,可能会显示警告,尽管我理解可以使用多个标签,所以不需要1-1对应,但2-1以上的可能是一个警告,而100-1实际上会抛出一个错误。无论如何,我非常感谢你们所有人所做的工作——虽然这个问题花了几个小时才找到,但你们帮我节省了几周的工作!谢谢!
bvjveswy3#
我已经使用了现有的文档ID,如
tags
和model.build_vocab(train_corpus)
,完成这个任务花了将近25分钟。在纪录片中的建议会很有帮助👍我遵循了Doc2Vec Model Tutorial。
代码示例:
h7wcgrx34#
@mkunib ,我不确定你在问什么。
但是,根据上面的讨论,即使你只有5个文档,因为你使用了高达9322041的普通整数ID,模型将为每个50维的522042个文档向量分配足够的空间。这需要大约1.9GB的空间,而不是如果使用(1)整数ID [0, 1, 2, 3, 4];或者(2)使用5个字符串ID - 甚至,你的5个整数的字符串。
当你这样过度分配时,日志中应该会有错误。
(即使有这样的过度分配,如果这个步骤花了25分钟,我还是会有点惊讶,除非还有其他问题,比如触发了交换。但也请注意即将发布的4.0.0版本对真正大型模型中的随机初始化进行了加速。)
2fjabf4q5#
类似于“当标签数量大大超过文档数量时,可能会显示警告”的代码片段对我帮助很大,因为我之前没有意识到这一点。或者在文档中给出建议:“如果你使用整数作为标签ID,请小心:它们应该从0开始且是连续的”,这对像我这样的初学者来说非常有用。
也许我在日志中错过了错误(
level=logging.DEBUG
)?错误应该在这里吗?cuxqih216#
是的,我原以为在"collected"行周围会出现一个现有的警告,当'unique tags'大于'examples'时-但似乎没有。(在即将发布的4.0.0版本中会有。)
如果25分钟的延迟发生在
resetting layer weights
行之后,那也是4.0.0版本中会更快的一个步骤(即使模型确实有数GB的doc-vecs,而不是仅仅因为错误而变得那么大)。