带有 keras 的 Elman RNN

数据挖掘 喀拉斯 rnn 预测
2022-03-05 12:54:53

我必须使用 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 对)。

0个回答
没有发现任何回复~