2016-08-05 8 views
1

私は100の長さの配列に切り分ける長さ1000の配列を持っています。だから私は長さ100の901シーケンスで終わる。最初の900をtrainXとする。 trainYは、これらのシーケンスの2番目から901番目です。1対1 LSTM

ケラスでは、次の画像モデルを作成したいと考えています。enter image description here重要な機能は、$ X_1 $が$ X_2 $、$ X_2 $が$ X_3 $にマップされていることです。私はこれらの100単位を描いていないという事実を無視してください。

ケラスでは、$ X_1 $〜$ X_ {100} $が$ X_ {101} $にマッピングされるモデルを構築する方法を知っています。これは、次によって行われます。

batch_size = 1 
time_steps = 100 
model = Sequential() 
model.add(LSTM(32, batch_input_shape=(batch_size, time_steps, 1), stateful=True)) 
model.add(Dense(1)) 

しかし、多くの場合に多くでは、次のようにエラーがチャック:

model = Sequential() 
model.add(LSTM(32, batch_input_shape=(batch_size, time_steps, 1), stateful=True, return_sequences=True)) 
model.add(Dense(1)) 

私は100個の出力はreturn_sequences=Trueを言って与えられているという事実を保存しよう。私はがbatch_size x hidden_nodesサイズの行列を入力として期待しているのに対し、私の場合は出力するとbatch_size x time_steps x hidden_nodesと出力されていることを考えると、エラーInput 0 is incompatible with layer dense_6: expected ndim=2, found ndim=3が得られます。

私の質問はどのように私は画像に示すように動作するLSTMを取得するのですか?高密度レイヤーでは、現在のタイムステップの正面(またはその場面)の隠れたレイヤーを誤って参照していないことが重要です。

答えて

1

複数の出力は必要ありません。シーケンスの次の数字を予測するようにモデルを訓練する。次に、予測された数値を使用して訓練されたモデルにフィードし、次の予測を予測してこのタスクを繰り返します。言い換えれば:

はトレーニングのためにデータを準備します

X_train = np.zeros((901, 100)) 
y_train = np.zeros((901, 1)) 
for i in range(901) 
    x_train[i,:] = x[i:i+100] 
    y_train[i,0] = x[i+101] 

を養成モデル:

for iteration in range(10000): 
    model.fit(x_train, y_train, batch_size = 40, nb_epoch = 2) 

を今、あなたが始まる次の10個の数字を予測したい場合:X [T: T + 101]

すべてを行う必要がある:

x_input = np.zeros((1, 100)) 
    x_input[0, :] = x[t+i: t+i+101] 
    for i in range(10) 
     y_output = model.predict(x_input) 
     print(y_output) 
     x_input[0, 0:100] = x[t+i+1: t+i+100] 
     x_input[100] = y_output 

この例では、batch_size = 40を使用しました。しかし、何でも使えます(しかし、私は1!;をお勧めしません))

+0

注:私はコードを実行しませんでした。私はちょうどそれを書いた。 – Nejla

+0

このバージョンの予測を行う方法はすでにわかっています。私が望むモデルは、あなたが言及したものとは少し異なります。 "ケラスでは、$ X_1 $〜$ X_ {100} $が$ X_ {101} $にマッピングされるモデルを構築する方法を知っています(多くの場合から1つのケース)" –