繁体   English   中英

Keras LSTM Autoencoder时序重建

[英]Keras LSTM Autoencoder time-series reconstruction

我正在尝试使用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)

模型

训练:

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)

重组:蓝色
输入:橙色

重建(蓝色)vs输入(橙色)

当损失很小时,为什么重建如此糟糕? 如何让模型变得更好? 谢谢。

在我看来,应该以这种格式给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:我使用了他/她提出的建议数据。

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

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

所以数据只是一些随机均匀噪声的完美总和。 我跑了1000个纪元,我的结果并不像你的那么糟糕,LSTM似乎在努力追随这条线,虽然它似乎只是在徘徊在奔跑的意义上(正如人们所预料的那样)。

胡说

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

胡说

这一点也就不足为奇了,通过这么小的训练集,我们应该完全期望模型过度拟合,而不是推广到新数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM