[英]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)
重組:藍色
輸入:橙色
當損失很小時,為什么重建如此糟糕? 如何讓模型變得更好? 謝謝。
在我看來,應該以這種格式給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.