Keras中LSTM的时间序列变分自动编码器

时间:2018-06-15 10:45:21

标签: keras deep-learning lstm autoencoder inference

我正在研究变分自动编码器(VAE)来检测时间序列中的异常。到目前为止,我使用了这个啧啧https://blog.keras.io/building-autoencoders-in-keras.htmlhttps://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 Layer,如果有必要重复我的样本z。但是如果我不使用RepeatVector Layer,LSTM-Layer会抛出一个错误,因为它需要一个3 dim输入。

2.)我对潜在变量的维数减少并不感到痛苦。因为我的In_dim = 1。究竟是什么减少了?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我已经在下面回答了您的问题。我建议多读一些有关LSTM的内容,例如colah's blog post。这将帮助您了解其含义,并且您会看到问题与LSTM网络的内部运作有关。

1)解码LSTM网络需要一些输入,就像您的编码LSTM使用了数据集中的输入数据一样。您可以反馈解码LSTM的输出,我们只需重复编码器的潜在状态即可(就像您的代码段一样)。可能有几种变化,但是似乎大多数作品都使用潜矢量来初始化解码LSTM中的隐藏状态,然后在进一步推出时将输出反馈到输入。 (例如,参见Recurrent AE model for multidimensional time series representationVariational Recurrent Auto-encoders

2)您的输入维为1,但超过100个时间步长。因此,您的实际输入尺寸为100x1。如果您在LSTM中将隐藏层的尺寸选择为32,则输入实际上将从100x1减少到32x。

如果您仍然需要更多信息,请有人在GitHub上发布了similar question