from gensim.models.doc2vec import Doc2Vec, TaggedDocument
from random import shuffle
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
tagged_data = []
clas = ['type1', 'type2', 'type3']
for cla in clas:
with open(f'../data/jieba/{cla}train.txt', 'r', encoding='UTF-8')as f:
i = 0
lines = f.readlines()
for line in lines:
tagged_data.append(TaggedDocument(words=line.split(' ')[:-1], tags=[cla + str(i)]))
i += 1
num_doc = len(tagged_data)
shuffle(tagged_data)
model = Doc2Vec(dm=1, vector_size=128, window=5, alpha=0.01, min_alpha=0.0001, max_vocab_size=100000, sample=1e-5, workers=4, epochs=3, hs=1, dm_mean=1)
model.build_vocab(tagged_data)
model.train(documents=tagged_data, epochs=model.epochs, total_examples=num_doc)
model.save("d2v.model")
上面是我的代码,输出就像
2019-05-11 01:11:48,177 : INFO : EPOCH 1 - PROGRESS: at 3.64% examples, 307751 words/s, in_qsize 7, out_qsize 0
2019-05-11 01:11:49,195 : INFO : EPOCH 1 - PROGRESS: at 7.63% examples, 316010 words/s, in_qsize 7, out_qsize 0
2019-05-11 01:11:50,196 : INFO : EPOCH 1 - PROGRESS: at 11.44% examples, 316465 words/s, in_qsize 8, out_qsize 0
如何在每一步中获取损失函数的值,以便我可以形象地看到它?
答案 0 :(得分:0)
Gensim的Word2Vec
和Doc2Vec
包含一个初始化参数compute_loss
,如果使用True
,则该初始化参数会使模型在训练过程中保持运行中的总损失,然后可以请求通过get_training_loss()
。参见:
https://radimrehurek.com/gensim/models/word2vec.html#gensim.models.word2vec.Word2Vec
但是,此培训损失报告是一项新功能,尚未完全像大多数人所期望的那样起作用。
例如,至少通过gensim 3.7.1(2019年1月),您可以检索自上次调用train()
之后的总损失(跨越多个时期)。某些pending changes可能最终会改变这一点,仅仅是一个训练时期的损失。
如果您要重复采样损失,则可能需要多次调用train()
(手动管理每次调用的纪元/字母),这很容易出错,或者使用{ {3}}可以运行您在训练中的某些点指定的功能。
(另外:您可能不想使用这么小的max_vocab_size=100000
来限制模型的最终词汇量。该设置将阻止初始词汇量调查 ever 跟踪超过100000个单词–在达到阈值的任何时候都丢弃许多记数法,最终词汇量可能远远少于100000,并且不一定包含100000个最常用的单词。如果在最初的调查中使用内存是一个问题,则应该使用一个慷慨的max_vocab_size
,比您想要的最终计数大得多,可以防止计数使用所有内存。使用max_final_vocab
和/或min_count
可以精确限制最后的词汇量的数据,没有任何过早的丢弃。)