Вариационный автоэнкодер на таймсериях с LSTM в Керасе

Я работаю над вариационным автоэнкодером (VAE) для обнаружения аномалий во временных рядах. Пока я работал с этим тут https://blog.keras.io/building-autoencoders-in-keras.html и этот https://wiseodd.github.io/techblog/2016/12/10/variational-autoencoder/.

Тем не менее, у меня возникли проблемы с внедрением VAE. У меня есть 77093 образца, которые имеют 1 измерение. Я использую timeteps = 100, чтобы делать прогнозы. Итак, я переделываю свой x_train следующим образом:

x_train.shape = (77093, 100, 1)

Модель:

inputs = Input(shape=(timesteps, input_dim))
encoded = LSTM(32)(inputs)

mu = Dense(1, activation='linear')(encoded)
log_sigma = Dense(1, activation='linear')(encoded)

z = Lambda(sample_z)([mu, log_sigma])

decoded = RepeatVector(timesteps)(z)
decoded = LSTM(1, return_sequences=True)(decoded)
decoded = LSTM(1)(decoded)

sequence_autoencoder = Model(inputs, decoded)

Я образец из:

def sample_z(args):
  mu, log_sigma = args
  eps = K.random_normal(shape=(50, 1), mean=0., stddev=1.)
 return mu + K.exp(log_sigma / 2) * eps

Модель компилируется. Но я не знаю, правильно ли это.

1.) Я не очень понимаю слой RepeatVector и, если необходимо, повторить мой образец z. Но если я не использую RepeatVector Layer, LSTM-Layer выдает ошибку, потому что ожидает 3 тусклых входа.

2.) Меня не беспокоит уменьшение размерности скрытой переменной. Потому что мой In_dim = 1. Что именно уменьшается?

Заранее спасибо.


person Aaron2Dev    schedule 15.06.2018    source источник
comment
stackoverflow.com/a/63991580/10375049   -  person Marco Cerliani    schedule 21.09.2020
comment
VAE LSTM для временных рядов: todatascience.com/   -  person Marco Cerliani    schedule 22.12.2020


Ответы (1)


Я ответил на ваши вопросы ниже. Я бы посоветовал почитать немного больше о LSTM, например. сообщение в блоге colah. Это поможет вам понять, о чем идет речь, и вы увидите, что ваши вопросы связаны с внутренней работой сети LSTM.

1) Для декодирующей сети LSTM требуется что-то в качестве входных данных, точно так же, как ваша кодирующая LSTM использовала входные данные из вашего набора данных. Вы можете либо оставить отзыв о выходе вашего декодирующего LSTM, либо просто повторить скрытое состояние вашего кодировщика (как это делает ваш фрагмент кода). Возможны несколько вариантов, но похоже, что в большинстве работ скрытый вектор используется для инициализации скрытого состояния в декодирующем LSTM, а затем обратная связь выходных данных на входные при дальнейшем развертывании. (См., Например, Рекуррентную модель AE для представления многомерного временного ряда и Вариационные рекуррентные автокодировщики)

2) Ваше входное измерение - 1, но более 100 временных шагов. Таким образом, ваш фактический входной размер составляет 100x1. Если вы выберете размер скрытого слоя в LSTM равным 32, то ваш ввод фактически уменьшится с 100x1 до 32.

Если вам все еще нужна дополнительная информация, кто-то разместил аналогичный вопрос на GitHub.

person dumkar    schedule 05.03.2019