Tom*_*zik 14 python time-series autoencoder lstm keras
我正在尝试使用LSTM Autoencoder(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)
Run Code Online (Sandbox Code Playgroud)
训练:
Epoch 1/100
5/5 [==============================] - 2s 384ms/step - loss: 0.1603
...
Epoch 100/100
5/5 [==============================] - 2s 388ms/step - loss: 0.0018
Run Code Online (Sandbox Code Playgroud)
训练后,我尝试重建5个样本之一:
yhat = model.predict(np.expand_dims(data[1,:,:], axis=0), verbose=0)
Run Code Online (Sandbox Code Playgroud)
重构:蓝色
输入:橙色

当损失很小时,为什么重建如此糟糕?如何改善模型?谢谢。
在我看来,应该以这种格式为 LSTM 提供一个时间序列:
(samples, features , window_size)
Run Code Online (Sandbox Code Playgroud)
因此,如果您更改格式,例如我交换了变量,然后查看结果:
重现结果的代码(我没有更改变量的名称,所以请不要混淆:)):
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,:])
Run Code Online (Sandbox Code Playgroud)
归功于 sobe86:我使用了他/她提出的数据。
我尝试在以下数据上运行您的代码
data = np.random.uniform(-0.1, 0.1, size=(5, 500))
data = data.cumsum(axis=1)
Run Code Online (Sandbox Code Playgroud)
所以数据只是一些随机均匀噪声的累积和。我跑了 1000 个 epoch,我的结果并不像你的那么糟糕,LSTM 似乎做了一些努力来遵循这条线,尽管它似乎只是在运行平均值附近徘徊(正如人们所期望的那样)。

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

这一点也不奇怪,对于如此小的训练集,我们应该完全预料到模型会过度拟合,而不是推广到新数据。