2017-03-08 120 views
1

我是張量流中的新手。我正在嘗試瞭解word2vec_basic腳本。tensoflow word2vec_basic輸入輸出佔位符

在開始時它定義了輸入和輸出。

train_inputs = tf.placeholder(tf.int32, shape=[batch_size]) 
train_labels = tf.placeholder(tf.int32, shape=[batch_size, 1]) 

如果我正確理解train_inputs的形狀 - [batch_size]是一個整數數組,並且陣列的長度是batch_size。那麼train_labels的形狀是[batch_size, 1],它是具有單行的矩陣。正確?如果是的話,我不明白爲什麼是這樣,以及應該在這些佔位符中存儲什麼。根據理論,label是一個int,input是上下文的滑動窗口的數組,所以爲什麼batch_size顯示在那裏?

這似乎是我錯過了理論中的一些基礎。我會很感激一個解釋。

回答

0

對於培訓,可以方便地對多個句子進行並行計算。這是batch_size的目的。批次中的每個單詞都來自數據中的不同部分,train_labels具有相應的標籤。梯度在整個批次中彙總,然後完成單個參數更新。

+0

只是爲了澄清一下,爲什麼在這種情況下標籤的形狀是[batch_size,1]而不是[batch_size]? – com

+0

我不確定。也許有一些地方必須乘以一個1xn大小的矩陣。 – Aaron

0

我最近發生的被調試word2vec_basic.py並作一個簡單的數據集例如「狗眼看貓狗追貓,貓爬上了樹」,dictionary{'the': 0, 'cat': 1, 'dog': 2, 'a': 3, 'saw': 4, 'chased': 5, 'climbed': 6, 'tree': 7}reverse_dictionary{0: 'the', 1: 'cat', 2: 'dog', 3: 'a', 4: 'saw', 5: 'chased', 6: 'climbed', 7: 'tree'}

當的batch_size = 8,skip_window = 1,embedding_size = 1,和num_skips = 2,主叫generate_batch返回: batch: [2 2 4 4 3 3 1 1] labels: [[0] [4] [2] [3] [4] [1] [0] [3]]

翻譯爲詞,它們是: batch: [dog, dog, saw, saw, a, a, cat, cat] labels: [[the], [saw], [dog], [a], [saw], [cat], [the], [a]]

對於第三個字「dog saw」in the data set,as skip_window is 1,expected(target,context)pairs should be(dog,the)and(dog,saw) - 詳情請參見https://www.tensorflow.org/tutorials/word2vec中的「Skip-gram模型」如果需要的話。

至於爲什麼1 [batch_size, 1]被使用,在該https://www.tensorflow.org/api_docs/python/tf/nn/nce_lossnce_loss文檔說「標籤:類型的int64的張量和形狀[batch_size時,num_true]的目標類。」。和「num_true:一個int。每個訓練示例的目標類的數量」。 (num_true有一個默認值1)

並在代碼中nce_loss定義:

 loss = tf.reduce_mean(
     tf.nn.nce_loss(weights=nce_weights, 
        biases=nce_biases, 
        labels=train_labels, 
        inputs=embed, 
        num_sampled=num_sampled, 
        num_classes=vocabulary_size)) 

所以,現在應該很容易看到的train_inputstrain_labels有意義的形狀。

+0

非常感謝您的回答。看起來批量中的nce_loss被硬連線跳過克,但由於某些原因,標籤允許多標籤分類。奇怪。如果對(dog,the)和(dog,saw)我假設目標單詞應該以批量形式出現在標籤和上下文中,但是其他方式。 – com