web-dev-qa-db-ja.com

KerasLSTMオートエンコーダ時系列の再構築

LSTMオートエンコーダー(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)

再構成:青
入力:オレンジ

Reconstion (blue) vs Input (orange)

損失が少ないのになぜ復興はそんなに悪いのか?どうすればモデルを改善できますか?ありがとう。

15
Tombozik

私には、時系列を次の形式でLSTMに与える必要があるように思われます。

 (samples, features , window_size)

したがって、フォーマットを変更した場合、たとえば、変数を交換して、結果を確認します。

enter image description here

結果を再現するためのコード(変数の名前は変更しなかったので、混乱しないでください:)):

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の功績:私は彼/彼女によって提案されたデータを使用しました。

4
moh

次のデータでコードを実行してみました

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

したがって、データはランダムな一様ノイズの累積合計にすぎません。私は1000エポックで走りましたが、私の結果はあなたの結果ほど悪くはありません。LSTMは、移動平均の周りをホバリングしているように見えますが、ラインに従うように努力しているようです(予想どおり)。

blah

これはTRAININGデータでモデルを実行していることに注意してください(これはあなたが質問で行っていたことを意味しているようです)-モデルがトレーニングされていないデータのパフォーマンスを調べようとすると、悪い結果が得られる可能性があります。

blah

これは少なくとも驚くべきことではありません。このような小さなトレーニングセットでは、モデルが過剰適合し、新しいデータに一般化しないことを完全に期待する必要があります。

2
sobe86