2016-06-25 3 views
1

Я новичок в word-embedding и Tensorflow. Я работаю над проектом, где мне нужно применить word2vec к данным о состоянии здоровья.
Я использовал код для сайта Tensorflow (word2vec_basic.py). Я изменил немного этот код, чтобы сделать его прочитать мои данные вместо «text8.zip» и она работает нормально до последнего шага:word2vec_basic не работает (Tensorflow)

num_steps = 100001 

with tf.Session(graph=graph) as session: 
# We must initialize all variables before we use them. 
    tf.initialize_all_variables().run() 
    print('Initialized') 
    average_loss = 0 
    for step in range(num_steps): 
    batch_data, batch_labels = generate_batch(
     batch_size, num_skips, skip_window) 
    feed_dict = {train_dataset : batch_data, train_labels : batch_labels} 
    _, l = session.run([optimizer, loss], feed_dict=feed_dict) 
    average_loss += l 
    if step % 2000 == 0: 
     if step > 0: 
     average_loss = average_loss/2000 
     # The average loss is an estimate of the loss over the last 2000 batches. 
     print('Average loss at step %d: %f' % (step, average_loss)) 
     average_loss = 0 
    # note that this is expensive (~20% slowdown if computed every 500 steps) 
    if step % 10000 == 0: 
    sim = similarity.eval() 
    for i in range(valid_size): 
     valid_word = reverse_dictionary[valid_examples[i]] 
     top_k = 8 # number of nearest neighbors 
     nearest = (-sim[i, :]).argsort()[1:top_k+1] 
     log = 'Nearest to %s:' % valid_word 
     for k in range(top_k): 
     close_word = reverse_dictionary[nearest[k]] 
     log = '%s %s,' % (log, close_word) 
     print(log) 
    final_embeddings = normalized_embeddings.eval()<code> 

Этот код является точно такой же, как пример, так что я не думаю, это неверно. ошибка Она дала это:


KeyError         Traceback (most recent call last) 
<ipython-input-20-fc4c5c915fc6> in <module>() 
    34   for k in xrange(top_k): 
    35   print(nearest[k]) 
---> 36   close_word = reverse_dictionary[nearest[k]] 
    37   log_str = "%s %s," % (log_str, close_word) 
    38   print(log_str) 

KeyError: 2868 

Я изменил размер входных данных, но она по-прежнему дает ту же ошибку.
Я был бы очень признателен, если бы кто-нибудь мог дать мне совет о том, как исправить эту проблему.

+0

Это означает, что ваш reverse_dictionary не имеет 2868-го элемента. Это немного странно, поскольку ближайший [k] следует выбирать из словарных слов. Я думаю, вам лучше загрузить весь исходный код. В противном случае проверьте размер словаря и valid_examples. – Jin

+0

Спасибо Джин, я нашел, где все пошло не так, но все еще не знаю, как исправить. Я использовал именно пример «word2vec_basic» веб-сайта. Но на шаге «text8.zip» я удалил несколько строк этого файла, чтобы он имел только 2/5 длины в качестве исходного текста. и появилась ошибка. И вы правы, мой словарь содержит только 2045 элементов. Является ли 2868 минимальной длиной для работы модели пропусков? – ngoduyvu

+0

Я так не думаю. Слово id 2868 случайным образом выбирается из вашего словаря. Поэтому он не должен превышать 2045. Именно поэтому я рекомендую вам загрузить всю часть исходного кода. Что-то должно быть неправильно. Я полагаю. – Jin

ответ

1

Если размер словаря меньше максимального по умолчанию (50000), вы должны изменить его.

На последнем шаге 2, давайте изменим словарный запас словаря до фактического размера словаря.

data, count, dictionary, reverse_dictionary = build_dataset(words) 
del words # Hint to reduce memory. 
print('Most common words (+UNK)', count[:5]) 
print('Sample data', data[:10], [reverse_dictionary[i] for i in data[:10]]) 

#add this line to modify 
vocabulary_size = len(dictionary) 
print('Dictionary size', len(dictionary)) 
+0

Вы правы, он исправил код. Я не полностью понимаю логику этого кода. Большое вам спасибо. Просто быстрый вопрос: num_steps = 100001, и если инструкция проверяет каждый шаг 2000. Это влияет на что-либо, так как мои данные только 2087? – ngoduyvu

+0

Отлично. Я не думаю, что num_steps или шаги проверки влияют на вашу программу. – Jin

+0

Спасибо, в любом случае мне нужно понять код, прежде чем – ngoduyvu

Смежные вопросы