无论如何都可以多次训练doc2vec模型

问题描述 投票:0回答:1

我不知道如何使用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个回答
0
投票

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

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

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

此技术的合理介绍可在以下位置找到:

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

单独:

    与已发表的作品相比,
  • 10000个纪元是一个荒谬的数目,后者通常使用10-20个纪元,对于非常小的数据集,有时更多。 (但是,如此小的数据集不太可能通过需要大量不同数据的Doc2Vec类算法获得良好的结果。但是,如果遇到内存问题,您的数据集可能并不小。)]]

  • 不要在您手动篡改train()值的循环中多次调用alpha。这是不必要的并且容易出错–实际上,您当前的代码是错误的,因为从0.0002起始字母中减去0.025数千次会驱动alpha负值,这是无意义的破坏性值。用所需的时期数一次调用train()-它将做正确的事。而且几乎不需要调整默认的alpha值。

  • [如果您希望获得更多的进度输出,或者只是为了更好地了解每个步骤的状态,请在INFO级别启用日志记录。

© www.soinside.com 2019 - 2024. All rights reserved.