Gensim doc2vec, как получить значение функции потерь на каждом шаге - PullRequest
0 голосов
/ 10 мая 2019
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 голосов
/ 11 мая 2019

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 г.) вы можете просто получить общую потерю с момента последнего вызова train() (в течение нескольких эпох).Некоторые ожидающие изменения могут в конечном итоге изменить это, чтобы быть просто потерей для одной тренировочной эпохи.

Если вы хотите сделать выборку повторно несколько раз, вам нужно либо вызвать train() нескольковремя (ручное управление эпохами / альфа на вызов), что очень подвержено ошибкам, или используйте возможность callbacks для запуска функции, которую вы указали в определенные моменты обучения.

(Отдельно: вы, возможно, не захотите использовать такой маленький max_vocab_size=100000, чтобы ограничить окончательный словарный запас вашей модели. Этот параметр предотвратит начальный словарный опрос от когда-либо отслеживания более 100000 слов -отбрасывание многих подсчетов в любое время при достижении этого порогового значения приводит к получению окончательного словаря, который может быть намного меньше 100 000 и не обязательно будет включать 100 000 наиболее распространенных слов. Если использование памяти во время этого первоначального опроса вызывает беспокойство, его целесообразно использоватьщедрое max_vocab_size, намного большее, чем конечное число, которое вы хотите, которое мешает подсчету использовать всю память. Использование max_final_vocab и / или min_count точно ограничит словарный запас в конце опроса, без каких-либопреждевременное отбрасывание.)

...