MemoryError:在 python 中使用 word2vec 时无法分配形状和数据类型为 float32 的数组

新手上路,请多包涵

我正在尝试从维基百科文本数据训练 word2vec 模型,因为我正在使用以下代码。

 import logging
import os.path
import sys
import multiprocessing

from gensim.corpora import  WikiCorpus
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence

if __name__ == '__main__':
    program = os.path.basename(sys.argv[0])
    logger = logging.getLogger(program)

    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s')
    logging.root.setLevel(level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))

    # check and process input arguments

    if len(sys.argv) < 3:
        print (globals()['__doc__'])
        sys.exit(1)
    inp, outp = sys.argv[1:3]

    model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())

    # trim unneeded model memory = use (much) less RAM
    model.init_sims(replace=True)

    model.save(outp)

但是程序运行 20 分钟后,出现以下错误

错误信息

原文由 suraj 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 596
2 个回答

理想情况下,您应该将错误 文本 粘贴到您的问题中,而不是屏幕截图。但是,我看到了两个关键行:

 <TIMESTAMP> : INFO : estimated required memory for 2372206 words and 400 dimensions: 8777162200 bytes
...
MemoryError: unable to allocate array with shape (2372206, 400) and data type float32

在对您的语料库进行一次遍历后,该模型了解了有多少独特的单词将存活下来,这报告了必须分配多大的模型:一个占用大约 8777162200 bytes (大约 8.8GB)。但是,当尝试分配所需的向量数组时,您会得到 MemoryError ,这表明没有足够的计算机可寻址内存 (RAM) 可用。

您可以:

  1. 在有更多内存的地方运行,也许通过向现有系统添加 RAM;或者
  2. 减少所需的内存量,主要是通过减少您想要训练的唯一词向量的数量或它们的维度大小。

You could reduce the number of words by increasing the default min_count=5 parameter to something like min_count=10 or min_count=20 or min_count=50 . (您可能不需要超过 200 万个单词向量——仅用几万个单词的词汇表就可能产生许多有趣的结果。)

您还可以设置 max_final_vocab 值,以指定要保留的唯一单词的确切数量。例如, max_final_vocab=500000 将只保留 500000 个最常用的词,忽略其余词。

减少 size 也将节省内存。 size=300 的设置在词向量中很受欢迎,可以将内存需求减少四分之一。

一起使用 size=300, max_final_vocab=500000 应该将所需的内存减少到 2GB 以下。

原文由 gojomo 发布,翻译遵循 CC BY-SA 4.0 许可协议

我在处理 pandas dataframe 时遇到了同样的问题,我通过将 float64 类型转换为 unint8 解决了这个问题(当然对于那些不一定需要是 float64 的,你可以尝试 float32 而不是 64)

数据[‘标签’] = 数据[‘标签’].astype(np.uint8)

如果遇到转换错误

data[‘label’] = data[‘label’].astype(np.uint8,errors=‘ignore’)

原文由 bohontw 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题