我必须使用 keras 对时间序列进行多步多元预测。我找到了一个使用 LSTM 的例子。我可以修改那个用 SimpleRNN 替换 LSTM 的例子。据我所知,现在我想使用与 SimpleRNN 不同的 Elman RNN。如何使用 keras 实现 Elman RNN?
我尝试更加明确,详细说明我想做的事情。
我有三个序列,其中两个代表输入,一个代表输出:
in_seq1 = array([10, 20, 30, 40, 50, 60, 70, 80, 90])
in_seq2 = array([15, 25, 35, 45, 55, 65, 75, 85, 95])
out_seq = array([in_seq1[i]+in_seq2[i] for i in range(len(in_seq1))])
这些序列用于填充数据结构 X 和 y 以便以下循环:
for i in range(len(X)):
print(X[i], y[i])
给出:
[[10 15]
[20 25]
[30 35]] [65 85]
[[20 25]
[30 35]
[40 45]] [ 85 105]
...
这意味着我将与 3 个时间步长相关的 X 值与与 2 个时间步长相关的 y 值相关联。
n_steps_in, n_steps_out = 3, 2
我正在尝试的 Elman 模型是:
model = Sequential()
model.add(SimpleRNN(100, activation='relu', return_sequences=True,
input_shape=(n_steps_in, n_features)))
model.add(TimeDistributed(Dense(n_steps_out, activation='relu')))
model.summary()
model.compile(optimizer='adam', loss='mse')
# fit model
model.fit(X, y, epochs=200, batch_size=n_steps_in, verbose=0)
在哪里
n_features = X.shape[2] # i.e., 2
现在,当我用
x_input = array([[70, 75], [80, 85], [90, 95]])
x_input = x_input.reshape((1, n_steps_in, n_features))
yhat = model.predict(x_input, verbose=0)
print(yhat)
我得到如下结果:
[[[195.89265 224.1713 ]
[162.78471 194.95282]
[139.1635 161.6026 ]]]
但也喜欢:
[[[207.80466 0. ]
[189.1255 0. ]
[184.61163 0. ]]]
或喜欢:
[[[ 0. 240.88077]
[ 0. 218.17479]
[ 0. 205.80429]]]
我想了解为什么有时 yhat 中有 0 个值(即预测的 y)以及为什么 yhat 有 6 个值(3 对)而不是 2 个(1 对)。