簡體   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