2016-06-25 10 views
1

私はワード埋め込みとTensorflowを初めて使用しています。私はword2vecを健康データに適用する必要があるプロジェクトに取り組んでいます。
私はTensorflowウェブサイト(word2vec_basic.py)のコードを使用しました。私は少し変更され、それは代わりに「text8.zip」の私のデータを読み取り、それが最後のステップまで正常に実行させるために、このコード:このコードをword2vec_basic not working(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の最後で、実際の辞書サイズにvocabulary_sizeを変更しましょう。

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とif文は2000ステップごとにチェックします。私のデータは2087年以来何にも影響しますか? – ngoduyvu

+0

それは素晴らしいです。私はnum_stepsやチェックステップがプログラムに影響するとは思わない。 – Jin

+0

ありがとう、とにかく私はコードを理解する必要があります – ngoduyvu