2016-09-27 44 views
18

tf.nn中有幾個與RNN相關的類。在我在網上找到的例子中,tf.nn.dynamic_rnntf.nn.rnn似乎可以互換使用,或者至少我似乎無法弄清楚爲什麼要用一個來代替另一個。有什麼不同?tensorflow dynamic_rnn和rnn有什麼區別?

+0

另請參閱此SO帖子https://stackoverflow.com/q/42497216/3924118,其中作者詢問有關'tf.nn.rnn'等效功能的更多最新版本的TensorFlow,它似乎是'tf.nn.static_rnn'。 – nbro

回答

24

RNNs in Tensorflow, a Practical Guide and Undocumented Features丹尼布里茨,發表於8月21日,2016年

tf.nn.rnn創建用於固定RNN長度的展開圖。那 的意思是,如果你打電話給tf.nn.rnn輸入有200個時間步,你就是 創建一個帶有200個RNN步的靜態圖。首先,圖形創建速度慢,爲 。其次,您無法傳遞比您最初指定的 更長的序列(> 200)。

tf.nn.dynamic_rnn解決了這個問題。它使用一個tf.While循環動態地執行 構建圖形。這意味着創建圖表的速度更快,您可以提供批量的可變大小。

+2

如果動態RNN提供了幾乎沒有缺點的所有優點,爲什麼還會使用靜態RNN? –

2

它們幾乎相同,但輸入和輸出結構有一些差異。從文檔:

tf.nn.dynamic_rnn

此功能在功能上等同於上述的功能rnn,但>執行的輸入完全動態展開。

rnn不同,輸入輸入不是張量的Python列表,每個幀都有一個 。相反,輸入可以是單張量,其中最大時間是第一維或第二維(參見參數 time_major)。或者,它可能是一個 Tensors(可能是嵌套的)元組,它們每個都有匹配的批處理和時間維度。 相應的輸出是具有與時間步長和批量大小相同的數字 的單張量或這種張量的(可能嵌套的)元組,匹配cell.output_size的嵌套結構。

有關更多詳細信息,請瀏覽source