2017-04-07 92 views
0

我想在特定輸入激活時生成一個序列。我想根據其相應的輸入神經元激活產生奇數或偶數序列。我正在嘗試使用LSTM創建模型,因爲它可以記住短期訂單。如何使用LSTM生成序列?

我試過這樣

import numpy as np 
from keras.models import Sequential 
from keras.layers import Dense,LSTM 


X=np.array([[1,0], 
      [0,1]]) 

Y=np.array([[1,3,5,7,9], 
      [2,4,6,8,10]]) 

model = Sequential() 
model.add(Dense(10, input_shape=(2)) 
model.add(LSTM(5, return_sequences=True)) 
model.add(LSTM(5, return_sequences=False)) 
model.add(Dense(5)) 
model.compile(loss='mse', optimizer='adam') 

model.fit(X,Y) 

但是,當我試圖符合該模式,給我這個錯誤

NameError: name 'model' is not defined

回答

2

要在Keras中使用RNN,您需要在數據中引入額外維度:時間步長。在你的情況下,你想有5個時間步。由於要在輸入和輸出數據之間建立一對多關係,因此需要將輸入數據複製5次。最後的LSTM圖層也必須設置爲返回序列,因爲您需要每個時步的結果而不僅僅是最後一個。爲了使Dense層意識到你需要用TimeDistributed層來包裝他們的時間維度。而最後一層密集層只有一個輸出,因爲每個時間步只輸出一個結果。

import numpy as np 
from keras.models import Sequential 
from keras.layers import Dense,LSTM 
from keras.layers.wrappers import TimeDistributed 

X=np.array([[[1, 0], 
     [1, 0], 
     [1, 0], 
     [1, 0], 
     [1, 0]], 

     [[0, 1], 
     [0, 1], 
     [0, 1], 
     [0, 1], 
     [0, 1]]]) 


Y=np.array([[[ 1], 
     [ 3], 
     [ 5], 
     [ 7], 
     [ 9]], 

     [[ 2], 
     [ 4], 
     [ 6], 
     [ 8], 
     [10]]]) 


model = Sequential() 
model.add(TimeDistributed(Dense(10), input_shape=(5, 2))) 
model.add(LSTM(5, return_sequences=True)) 
model.add(LSTM(5, return_sequences=True)) 
model.add(TimeDistributed(Dense(1))) 
model.compile(loss='mse', optimizer='adam') 

model.fit(X,Y, nb_epoch=4000) 

model.predict(X) 

有了這個後約4000時代下的結果我得到:

Epoch 4000/4000 
2/2 [==============================] - 0s - loss: 0.0032 
Out[20]: 
array([[[ 1.02318883], 
     [ 2.96530271], 
     [ 5.03490496], 
     [ 6.99484348], 
     [ 9.00506973]], 

     [[ 2.05096436], 
     [ 3.96090508], 
     [ 5.98824072], 
     [ 8.0701828 ], 
     [ 9.85805798]]], dtype=float32) 
+0

感謝您的答覆,是否有更好的方法來預測下一序列'[11,13,15,17, 19],[12,14,16,18,20]]'沒有訓練與此序列 – Eka

1

同時更改代碼下面model.add(Dense(10, input_shape=(2))

model.add(Dense(10, input_shape=(2,))) 

model.add(Dense(5)) # Remove this 

注是等價的:

model = Sequential() 
model.add(Dense(32, input_shape=(2,))) 

model = Sequential() 
model.add(Dense(32, input_dim=2))