在 Keras 中使用 LSTM 对时间序列进行变分自动编码器

Aar*_*Dev 5 inference autoencoder deep-learning lstm keras

我正在研究一个变分自动编码器 (VAE) 来检测时间序列中的异常。到目前为止,我使用了这个 tut https://blog.keras.io/building-autoencoders-in-keras.html和这个https://wiseodd.github.io/techblog/2016/12/10/variational-autoencoder/ .

不过,我在实施 VAE 时遇到了一些麻烦。我有 77093 个具有 1 维的样本。我使用 timesteps=100 进行预测。所以我重塑我的 x_train 如下:

x_train.shape = (77093, 100, 1)
Run Code Online (Sandbox Code Playgroud)

该模型:

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)
Run Code Online (Sandbox Code Playgroud)

我从以下样本中取样:

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
Run Code Online (Sandbox Code Playgroud)

模型编译。但我不知道它是否正确。

1.) 我不太了解RepeatVector 层以及是否有必要重复我的样本z。但是如果我不使用 RepeatVector 层,LSTM 层会抛出一个错误,因为它需要一个 3 暗的输入。

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

提前致谢。

dum*_*kar 4

我已经在下面回答了你的问题。我建议阅读更多有关 LSTM 的内容,例如colah 的博客文章。这将帮助您理解它的含义,并且您会发现您的问题与 LSTM 网络的内部工作原理相关。

1) 解码 LSTM 网络需要一些东西作为输入,就像编码 LSTM 使用数据集中的输入数据一样。您可以反馈解码 LSTM 的输出,我们只需重复编码器的潜在状态(正如您的代码片段所做的那样)。有几种可能的变化,但似乎大多数工作都使用潜在向量来初始化解码 LSTM 中的隐藏状态,然后在进一步推出时将输出反馈到输入。(参见例如用于多维时间序列表示的循环AE模型变分循环自动编码器

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

如果您仍需要更多信息,有人在 GitHub 上发布了类似的问题