Реконструкция временных рядов автокраски Keras LSTM - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь восстановить данные временных рядов с помощью 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)

Восстановление: синий
Вход: оранжевый

Reconstion (blue) vs Input (orange)

Почему реконструкция так плоха, когда потери невелики?Как я могу сделать модель лучше?Благодаря.

Ответы [ 2 ]

0 голосов
/ 25 июля 2019

Мне кажется, что 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: Я использовал предложенные им данные.

0 голосов
/ 24 июля 2019

Я попытался запустить ваш код на следующих данных

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

, поэтому данные представляют собой просто кумулятивную сумму некоторого случайного однородного шума.Я бежал за 1000 эпох, и мои результаты не так плохи, как у вас, LSTM, кажется, прилагает некоторые усилия, чтобы следовать линии, хотя кажется, что она просто колеблется вокруг скользящего среднего (как можно было ожидать).

blah

Обратите внимание, что эта модель работает с данными ОБУЧЕНИЯ (что, по-видимому, подразумевает, что вы делали это в своем вопросе) - если мы попытаемся взглянуть на производительность на данных, которых не было в моделиобучаясь, мы можем получить плохие результаты.

blah

Это неудивительно в меньшей степени, с таким небольшим набором тренировок, мы должны полностью ожидать, что модель будет соответствовать, а необобщить на новые данные.

...