我不知道如何使用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")
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
级别启用日志记录。