【问题标题】:Is there anyway to train doc2vec model in multiples batches无论如何要分批训练 doc2vec 模型
【发布时间】:2020-06-01 03:49:11
【问题描述】:

我不知道如何使用 doc2vec 分批训练模型。由于我将所有数据加载到 ram 中并且无法加载

#Import all the dependencies
from gensim.models.doc2vec import Doc2Vec, TaggedDocument

import nltk
nltk.download('punkt')

from nltk.tokenize import word_tokenize
#import ReadExeFileCapstone
import update-doc2vec 
mapData = ReadExeFileCapstone.readData()

# print ('mapData', mapData)

max_epochs = 10000
vec_size = 200
alpha = 0.025

model = Doc2Vec(size=vec_size,
                alpha=alpha,
                min_alpha=0.00025,
                min_count=1,
                dm =1)
data = []
for key in mapData:
    listData = mapData[key]
    # print ("listData: ", len(listData), listData)

    for i in range(len(listData)):
        listToStr = ' '.join([str(elem) for elem in listData[i]]) #convert array to list string
        data.append(listToStr)

tagged_data = [TaggedDocument(words=word_tokenize(_d.lower()), tags=[str(i)]) for i, _d in enumerate(data)]


model.build_vocab(tagged_data)
#build vocab
for epoch in range(max_epochs):
    print('iteration {0}'.format(epoch))
    model.train(tagged_data,
                total_examples=model.corpus_count,
                epochs=model.iter)
    # decrease the learning rate
    model.alpha -= 0.0002
    # fix the learning rate, no decay
    model.min_alpha = model.alpha
# train model   
model.save("d2v_ASM.model")
print("Model Saved")

【问题讨论】:

    标签: gensim doc2vec


    【解决方案1】:

    Doc2Vec(和gensim 中的类似模型类)不需要将完整的训练数据作为内存列表。他们将接受一个 Python 的“可迭代”对象,它只是重复地一次提供一个项目。

    这样的可迭代对象可以从其他来源流式传输项目,例如磁盘上的大文件——甚至是比可用 RAM 大得多的文件。

    尚不清楚您的 ReadExeFileCapstone 实用程序类在做什么。 (此名称的代码没有网络点击。)但是,它可能会更改为自身返回一个可迭代对象,每次迭代时,都会从原始文本中一次一个地返回每个文本数据源。然后,您可以将其包装在代码中以创建必要的 TaggedDocument 对象,再次作为可迭代对象而不是内存中的完整列表。

    此技术的合理介绍可在以下位置获得:

    https://rare-technologies.com/data-streaming-in-python-generators-iterators-iterables/

    分别:

    • 与已发表的作品相比,10000 个 epoch 的数量大得离谱,后者通常使用 10-20 个 epoch,对于非常小的数据集有时更多。 (但是,这样小的数据集不太可能从Doc2Vec 类似的算法中获得良好的结果,这些算法需要大量不同的数据。但是,如果您遇到内存问题,您的数据集可能并不小。)

    • 不要在手动篡改alpha 值的循环中多次调用train()。这是不必要且容易出错的——事实上你当前的代码是错误的,因为从你的0.025starting-alpha 中减去0.0002 数千次将导致alpha 为负值,这是一个荒谬且具有破坏性的值。使用您想要的 epoch 数调用一次 train() - 它会做正确的事情。而且很少需要调整默认的alpha 值。

    如果您想要更多的进度输出 - 或者只是为了更好地了解每个步骤发生的情况 - 在 INFO 级别启用日志记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 2016-08-17
      • 2018-07-31
      • 2018-12-10
      • 1970-01-01
      相关资源
      最近更新 更多