2016-02-17 27 views
5

我剛開始玩TensorFlow,我試圖實現一個非常簡單的RNN。 RNN具有x作爲輸入,y作爲輸出,並且由僅包含x並且其先前輸出作爲輸入的單個層組成。下面是這類事情的圖片我心目中:如何在TensorFlow中的圖形中創建一個簡單的RNN?

A simple RNN

的問題是,我無法看透TensorFlow API的任何方式來構造,在它的週期的圖表。每當我定義一個張量時,我必須指定它的輸入是什麼,這意味着我必須已經定義了它的輸入。所以這是一個雞與雞蛋的問題。

我甚至不知道是否有必要定義一個帶有循環的圖(首先計算什麼?我需要定義softmax節點的初始值?)。我玩的想法是使用一個變量來表示先前的輸出,然後手動取值y,並在每次通過訓練樣本後將其存儲在變量中。但是這樣會很慢,除非有一種方法可以在圖形本身中表示這個過程(?)。

我知道TensorFlow教程顯示了RNN的示例實現,但他們欺騙並將LSTM模塊拉出已經具有循環的庫。總的來說,這些教程很好地幫助你瞭解如何構建某些東西,但是他們可以更好地解釋這種野獸是如何運作的。

那麼,TensorFlow的專家,有沒有辦法構建這個東西?我該怎麼去做呢?

+0

你的變量想法似乎是一種方式去,如果你使用TensorFlow變量/賦值操作不應該慢 –

+0

但我不需要調用'sess.run(y_prev.assign(y))'並運行一次一個樣本?或者你的意思是我應該將這與@Ishamael描述的展開策略結合起來? – Shum

回答

2

事實上,所有機器學習框架中的前向和後向傳遞都假定您的網絡沒有周期。實施經常性網絡的一種常見方式是及時展開幾個步驟(比如說50),並因此將具有循環的網絡轉換爲沒有任何循環的網絡。

例如,在文檔你指的是:

https://www.tensorflow.org/versions/r0.7/tutorials/recurrent/index.html

他們提到

爲了使學習過程中容易處理,它是一種常見的做法,以截斷梯度用於反向傳播到展開步驟的固定數量(num_steps)。

它所實際上意味着是,他們將創建num_steps LSTM細胞,其中每個作爲輸入爲當前時間步長的值x以前 LSTM模塊的輸出。

他們使用的BasicLSTMCell和你認爲有一個循環實際上沒有循環。 LSTM單元只是單個LSTM步驟(具有兩個輸入[輸入和存儲器]和兩個輸出[輸出和存儲器],並使用門計算輸入輸出的塊)的實現,而不是整個LSTM網絡。

相關問題