使用Keras中的LSTM预测时间序列数据

时间:2018-05-13 08:13:51

标签: python-3.x keras deep-learning

我正在尝试准备一个模型来预测给定数组中的前两个数字。因此,输入数据集就像这样 -

[1 2 3 5] [4 8 5 9] [10 2 3 15]

输出将是 - [1 2] [4 8] [10 2]

因此,RNN的架构如下所示(摘自here

enter image description here 然后,我想要实现的基本架构应该接近这个 -

因此,它应该是一个多对多网络。 (类似于第四张图片)

问题 - 那么,我如何使用Keras创建这种类型的模型?

我的发现 -

我尝试过这样的事情 -

n_samples = 10000
input = np.random.randint(5,10, (n_samples,5))
output = input[...,0:2]
rinp = input.reshape(n_samples,1,5)

model = Sequential()
model.add(LSTM(10, input_shape=(1,5)))
model.add(Dense(2))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(rinp, output, epochs=1000, batch_size=500, verbose=1)

但正如你所看到的,这甚至都不是很接近。这就像一个MLP。它不使用任何时间步骤。因为,输入形状是 - (n_samples,1,5)。所以,只有一个时间步骤。

所以,我的实现是错误的。

我已经看到here中的一对一,多对一和多对多示例的一些示例。

在“多对多”示例中,作者使用了以下代码段。

length = 5
seq = array([i/float(length) for i in range(length)])
X = seq.reshape(1, length, 1)
y = seq.reshape(1, length, 1)
# define LSTM configuration
n_neurons = length
n_batch = 1
n_epoch = 1000
# create LSTM
model = Sequential()
model.add(LSTM(n_neurons, input_shape=(length, 1), return_sequences=True))
model.add(TimeDistributed(Dense(1)))
model.compile(loss='mean_squared_error', optimizer='adam')
print(model.summary())
# train LSTM
model.fit(X, y, epochs=n_epoch, batch_size=n_batch, verbose=2)
# evaluate
result = model.predict(X, batch_size=n_batch, verbose=0)
for value in result[0,:,0]:
    print('%.1f' % value)

Xy值可以看出,所描述的模型如下所示 -

这不是我想要实现的目标。

关于我正在尝试实现的架构的任何示例都将非常有用。

1 个答案:

答案 0 :(得分:0)

看起来您正在尝试基于绘图构建序列到序列(seq2seq)模型。有一个非常好的tutorial online让你入门。您可以预测长度为2的固定长度令牌,而不是预测句子。这种架构和变体通常用于机器翻译。根据您的数据,我猜你正试图在循环网络中试验长期依赖的问题;否则,将seq2seq用于任何实际目的是没有意义的。