2

當試圖編譯一個具有一個經常性圖層的網絡時,我發現問題。似乎第一層的維度存在一些問題,因此我對Keras中RNN層的工作原理有所瞭解。Keras簡單的RNN實現

我的代碼示例是:

model.add(Dense(8, 
       input_dim = 2, 
       activation = "tanh", 
       use_bias = False)) 
model.add(SimpleRNN(2, 
        activation = "tanh", 
        use_bias = False)) 
model.add(Dense(1, 
       activation = "tanh", 
       use_bias = False)) 

該錯誤是

ValueError: Input 0 is incompatible with layer simple_rnn_1: expected ndim=3, found ndim=2 

input_dim無關的值將返回此錯誤。我錯過了什麼?

回答

2

該消息表示:進入rnn的輸入有2個維度,但rnn層需要3個維度。

對於RNN圖層,需要形狀如(BatchSize, TimeSteps, FeaturesPerStep)的輸入。這些是預期的3個維度。

A Dense圖層(在keras 2中)可以使用2維或3維。我們可以看到您正在使用2,因爲您通過了input_dim而不是傳遞了input_shape=(Steps,Features)

解決這個問題的方法有很多種,但最有意義和最合理的是輸入數據是帶時間步長的序列。

解決方案1 ​​ - 您的訓練數據是一個序列:

如果你的訓練數據是一個序列,你塑造它喜歡(NumberOfSamples, TimeSteps, Features)並把它傳遞到您的模型。確保在第一層使用input_shape=(TimeSteps,Features)而不是使用input_dim

解決方案2 - 你重塑第一致密層的輸出,所以它有額外的維度:

model.add(Reshape((TimeSteps,Features))) 

確保產品TimeSteps*Features等於8,你的第一個緻密層的輸出。

+0

太棒了,謝謝你,另外一個問題。第一個解決方案是完美的,但是如果我想要有無限的時間步驟(理論問題,我知道,無限的時間步驟是愚蠢的)?然後,我必須使用你的第二個解決方案來重塑第一層的輸出。但是,我通過記憶XOR序列做了簡單的測試,當我對輸出進行混洗時,網絡未能按照我的預期做出反應。更好地說,它的輸出與之前的洗牌相同。如何重塑影響復發層的工作(與第一種解決方案相比)? – Seraph

+1

整形只需要數據(任何數據),這只不過是按照分段劃分的一串連續數字。假設你有300個元素。當你像(30,10,1)那樣重塑它們時,你只需以不同的方式分離這300個元素。所以,如果你爲了序列目的而重塑形狀,你必須知道你想要達到什麼樣的目標,以及你的數據的格式是什麼,所以你可以用一個重要的方式來重塑它。 –

+0

對於您的無限序列,您應該只使用1個樣本'(BatchSize = 1,TimeSteps,Features)'的輸入,並用'stateful = True'標記您的循環圖層。這意味着這些圖層將保持其記憶,並且下一批將被視爲以一個單一序列繼續前一批。在這種情況下,當您決定一個序列結束並且您將開始輸入另一個序列時,您必須手動「刪除存儲器」(稱爲「復位狀態」)。 –