2016-03-26 21 views

回答

3

細胞callable是一個函數,其採用輸入tf.Tensor和當前狀態作爲tf.Tensor,並返回一個輸出tf.Tensor和新狀態作爲tf.Tensor。輸入/輸出和狀態張量沒有什麼特別之處:這些可以從其他TensorFlow操作的輸入計算和/或用作輸入。

有關示例,看看ptb_word_lm.py模型:

for time_step in range(num_steps): 
    # ... 
    (cell_output, state) = cell(inputs[:, time_step, :], state) 
    outputs.append(cell_output) 

這裏,inputs是從其中一個片被取爲得到該LSTM的一個單元的輸入端的3-d張量,並stateinitially使用cell.zero_state()計算,然後每個後續迭代使用來自先前迭代的狀態。

inputs張量是tf.nn.embedding_lookup()操作的result; outputs列表爲later concatenated,並用作損失計算的輸入。 TensorFlow通過RNN和嵌入查找將損失反向回傳給模型變量。

+0

我認爲你描述的方法有一個缺點,即如果num_steps非常大,圖形將花費大量的時間和內存進行初始化。此外,如果您從一開始就不知道時間序列的長度(即流式傳輸數據),則您的網絡將進行處理將毫無用處。糾正我,如果我錯了 –

+0

是的,在某些情況下,你應該使用['tf.nn.dynamic_rnn()'](https://www.tensorflow.org/versions/r0.9/api_docs/python/nn .html#dynamic_rnn),它不展開循環。目前沒有處理流數據的庫方法,但原始問題沒有這個要求。對於流數據,你可以使用'tf.while_loop()'來實現某些東西,但是當你知道提前的最大時間步數時,當前實現會更有效率。 – mrry

相關問題