Python Keras-LSTM自动编码器时间序列重构

Python Keras-LSTM自动编码器时间序列重构,python,keras,time-series,lstm,autoencoder,Python,Keras,Time Series,Lstm,Autoencoder,我正在尝试用LSTM自动编码器(Keras)重建时间序列数据。 现在我想在少量样本上训练自动编码器(5个样本,每个样本有500个时间步长,并且有1个维度)。我想确保模型能够重建这5个样本,然后我将使用所有数据(6000个样本) 培训: Epoch 1/100 5/5 [==============================] - 2s 384ms/step - loss: 0.1603 ... Epoch 100/100 5/5 [============================

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

培训:

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 = np.random.uniform(-0.1, 0.1, size=(5, 500))
data = data.cumsum(axis=1)
因此,数据只是一些随机均匀噪声的累加和。我跑了1000个纪元,我的成绩没有你的那么差,LSTM似乎在努力跟随这条线,尽管它似乎只是徘徊在跑步平均值附近(正如人们所预料的那样)

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


这一点也不足为奇,因为训练集如此之小,我们完全应该期望模型过度拟合,而不是泛化到新数据中。

在我看来,应该以以下格式为LSTM提供一个时间序列:

 (samples, features , window_size)
因此,如果您更改格式,例如,我交换了变量,并查看结果:

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


sobe86的功劳:我使用了他/她提出的数据。

您能显示从
数据[0,:,:]
数据[4,:,:]
的所有图表吗?
 (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,:])