Keras LSTM 自动编码器时间序列重建

Posted

技术标签:

【中文标题】Keras LSTM 自动编码器时间序列重建【英文标题】:Keras LSTM Autoencoder time-series reconstruction 【发布时间】:2019-04-29 19:09:14 【问题描述】:

我正在尝试使用 LSTM 自动编码器 (Keras) 重建时间序列数据。 现在我想在少量样本上训练自动编码器(5 个样本,每个样本有 500 个时间步长并且有 1 个维度)。我想确保模型可以重建这 5 个样本,然后我将使用所有数据(6000 个样本)。

window_size = 500
features = 1
data = data.reshape(5, window_size, features)

model = Sequential()

model.add(LSTM(256, input_shape=(window_size, features), 
return_sequences=True))
model.add(LSTM(128, input_shape=(window_size, features), 
return_sequences=False))
model.add(RepeatVector(window_size))

model.add(LSTM(128, input_shape=(window_size, features), 
return_sequences=True))
model.add(LSTM(256, input_shape=(window_size, features), 
return_sequences=True))
model.add(TimeDistributed(Dense(1)))

model.compile(optimizer='adam', loss='mse')
model.fit(data, data, epochs=100, verbose=1)

Model

培训:

Epoch 1/100
5/5 [==============================] - 2s 384ms/step - loss: 0.1603
...
Epoch 100/100
5/5 [==============================] - 2s 388ms/step - loss: 0.0018

训练后,我尝试重建 5 个样本之一:

yhat = model.predict(np.expand_dims(data[1,:,:], axis=0), verbose=0)

重构:蓝色 输入:橙色

为什么在损失很小的情况下重建如此糟糕?我怎样才能使模型更好?谢谢。

【问题讨论】:

您能显示从data[0,:,:]data[4,:,:] 的所有图表吗? 【参考方案1】:

在我看来,应该以这种格式为 LSTM 提供时间序列:

 (samples, features , window_size)

所以,如果你改变格式,比如我交换了变量,看看结果:

重现结果的代码(我没有更改变量的名称,所以请不要混淆:)):

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

N = 10000
data = np.random.uniform(-0.1, 0.1, size=(N, 500))
data = data.cumsum(axis=1)
print(data.shape)
window_size = 1
features = 500
data = data.reshape(N, window_size, features)

model = Sequential()

model.add(LSTM(32, input_shape=
(window_size,features), 
return_sequences=True))
model.add(LSTM(16, input_shape=(window_size,   
features), 
return_sequences=False))
model.add(RepeatVector(window_size))

model.add(LSTM(16, input_shape=(window_size, 
features), 
return_sequences=True))
model.add(LSTM(32, input_shape=(window_size,   
features), 
return_sequences=True))
model.add(TimeDistributed(Dense(500)))

model.compile(optimizer='adam', loss='mse')
model.fit(data, data, epochs=100, verbose=1)


yhat = model.predict(np.expand_dims(data[1,:,:],   axis=0), verbose=0)
plot(np.arange(500), yhat[0,0,:])
plot(np.arange(500), data[1,0,:])

感谢sobe86:我使用了他/她提出的数据。

【讨论】:

【参考方案2】:

我尝试在以下数据上运行您的代码

data = np.random.uniform(-0.1, 0.1, size=(5, 500))
data = data.cumsum(axis=1)

所以数据只是一些随机均匀噪声的累积和。我跑了 1000 个 epoch,我的结果没有你的那么差,LSTM 似乎做了一些努力来遵循这条线,尽管它似乎只是在运行均值附近徘徊(正如人们所预料的那样)。

请注意,这是在 TRAINING 数据上运行模型(您似乎暗示您在问题中正在这样做) - 如果我们尝试查看模型未经训练的数据的性能,我们可能会得到不好的结果.

这至少不足为奇,对于这么小的训练集,我们应该完全期望模型会过度拟合,而不是泛化到新数据。

【讨论】:

以上是关于Keras LSTM 自动编码器时间序列重建的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌入层的 Keras LSTM 自动编码器

LSTM 自动编码器问题

在 Keras 中为 LSTM 重塑批次

如何在 Keras 的两个 LSTM 层之间添加注意力层

如何在 Keras、RepeatVector 或 return_sequence=True 中连接 LSTM 层?

Keras 中带有 LSTM 的多层 Seq2Seq 模型