2017-02-20 77 views
1

我使用Keras與Tensorflow作爲後端,並得到不兼容的錯誤:Keras:ValueError異常:輸入0不兼容層發出

model = Sequential() 
model.add(LSTM(64, input_dim = 1)) 
model.add(Dropout(0.2)) 
model.add(LSTM(16)) 

以下錯誤顯示:

Traceback (most recent call last): 
    File "train_lstm_model.py", line 36, in <module> 
    model.add(LSTM(16)) 
    File "/home/***/anaconda2/lib/python2.7/site-packages/keras/models.py", line 332, in add 
    output_tensor = layer(self.outputs[0]) 
    File "/home/***/anaconda2/lib/python2.7/site-packages/keras/engine/topology.py", line 529, in __call__ 
    self.assert_input_compatibility(x) 
    File "/home/***/anaconda2/lib/python2.7/site-packages/keras/engine/topology.py", line 469, in assert_input_compatibility 
    str(K.ndim(x))) 
ValueError: Input 0 is incompatible with layer lstm_2: expected ndim=3, found ndim=2 

我怎樣才能解決這個問題問題?

Keras版本:1.2.2 Tensorflow版本:0.12

回答

1

LSTM層接受在​​形狀輸入。你提供的輸入形狀只有1-dim,所以這個錯誤來自哪裏。錯誤消息的確切形式來自數據的實際形狀包括batch_size。因此,提供給圖層的數據的實際形狀是(batch_size, len_of_sequences, nb_of_features)。你的形狀是(batch_size, 1),這就是3d2d輸入背後的原因。

此外 - 你可能會遇到與第二層類似的問題。爲了使您的LSTM層返回一個序列,你應該改變它的定義:

model.add(LSTM(64, input_shape = (len_of_seq, nb_of_features), return_sequences=True) 

或:

model.add(LSTM(64, input_dim = nb_of_features, input_len = len_of_sequence, return_sequences=True) 
+0

我已經驗證了它的工作原理是隻設置'input_dim'獨自一人,那調理將'return_sequences'設置爲True。你能告訴我爲什麼我必須設置'return_sequences'嗎? –

+0

每次將輸出饋送到經常性網絡時,都應將return_srquences設置爲True。它使你的圖層輸出整個計算序列。如果設置爲false,則返回一維矢量(默認情況下,它被設置爲序列的最後一個輸出)。 –

+0

我的答案是正確還是錯誤? –