2016-09-21 65 views
3

我想訓練一個可以改變數組大小的數據。例如,假設我們希望訓練句子。第一句話是「我是約翰」,第二句是「我知道」。如果句子轉換成張量。第一件事會變成[「我」,「上午」,「約翰」],下一個將會是[「我」,「知道」]。因此,第一個數組需要3個n_input作爲佔位符的形狀。但是,第二個陣列需要2個。如何在非確定性數組大小的佔位符中設置形狀

x = tf.placeholder("float", [None, n_input]) 
y = tf.placeholder("float", [None, n_classes]) 

我需要上述代碼來定義佔位符。但是,我無法確定n_input。

此外,形狀中的無是什麼意思? BATCH_SIZE? 請幫幫我。

+0

你的問題還不清楚。似乎你想使用循環神經網絡來訓練可變長度的序列,但你似乎有點丟失,也許你可以開始使用Tensorflow教程? – jean

+0

可變輸入大小的方法並不常見。如果您的數據在形狀上非常多樣化,請考慮使用RNN(如上面提到的牛仔褲)或嘗試使用縮放/填充,但它不是文本處理的好方法。 –

+0

請仔細閱讀文檔,您會發現「形狀:要輸入張量的形狀(可選)。如果沒有指定形狀,可以輸入任何形狀的張量。」 – lerner

回答

4

從技術上說,佔位符根本不需要形狀。它可以被定義爲這樣。

x =tf.placeholder(tf.float32, shape=[]) 

在這種情況下,佔位符本身沒有形狀信息。如果您知道張量的尺寸,但不是實際的數字形狀,我們用None替換該尺寸的數值,因爲它可以具有可變尺寸。

x =tf.placeholder(tf.float32, shape=[None, None, None]) 

這會影響到一些下游的靜態形狀分析認爲tensorflow確實獲得形狀信息,但否則按預期應該仍然工作。

+0

謝謝。我有一個轉置問題。在mnist教程中,首先佔位符x被設置爲[None,n_steps,n_input],這意味着輸入數據數組(batch_size,n_step,n_input,據我所知)。作爲mnist教程的下一步,x是[1,0 ,2]。我認爲x數組將被轉換爲(n_step,batch_size,n_input)。我的問題是爲什麼轉置是需要的。 – hackartist

+0

我不確定你指的是哪個mnist教程。請你提供一個鏈接?如果問題已解決,請將其標記爲已完成 – Steven

+0

@hackartist此轉置在RNN-MNIST教程中完成,因爲rnn函數需要n_step x [batch_size,n_input]的列表,這在TensorFlow API但是如果你使用「newer」dynamic_rnn函數,那麼這個換位就不再需要了。 – bsautermeister

0

在像您這樣的場景中,我們通常會將第二維(time_steps或輸入長度)設置爲常數(例如句子的最大長度),並且直接使用填充或零填充空格。然後你可以設置佔位符爲:

x = tf.placeholder(tf.int32, [None, max_input_steps]) 
y = tf.placeholder(tf.int32, [None, nax_output_steps]) 
相關問題