Gensim doc2vec,如何在每一步中获取损失函数的值

时间:2019-05-10 17:23:34

标签: nlp gensim doc2vec

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

如何在每一步中获取损失函数的值,以便我可以形象地看到它?

1 个答案:

答案 0 :(得分:0)

Gensim的Word2VecDoc2Vec包含一个初始化参数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可以精确限制最后的词汇量的数据,没有任何过早的丢弃。)