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)
再構成:青
入力:オレンジ
損失が少ないのになぜ復興はそんなに悪いのか?どうすればモデルを改善できますか?ありがとう。
私には、時系列を次の形式で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データでモデルを実行していることに注意してください(これはあなたが質問で行っていたことを意味しているようです)-モデルがトレーニングされていないデータのパフォーマンスを調べようとすると、悪い結果が得られる可能性があります。
これは少なくとも驚くべきことではありません。このような小さなトレーニングセットでは、モデルが過剰適合し、新しいデータに一般化しないことを完全に期待する必要があります。