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。究竟减少了什么?
提前致谢。
我已经在下面回答了你的问题。我建议阅读更多有关 LSTM 的内容,例如colah 的博客文章。这将帮助您理解它的含义,并且您会发现您的问题与 LSTM 网络的内部工作原理相关。
1) 解码 LSTM 网络需要一些东西作为输入,就像编码 LSTM 使用数据集中的输入数据一样。您可以反馈解码 LSTM 的输出,我们只需重复编码器的潜在状态(正如您的代码片段所做的那样)。有几种可能的变化,但似乎大多数工作都使用潜在向量来初始化解码 LSTM 中的隐藏状态,然后在进一步推出时将输出反馈到输入。(参见例如用于多维时间序列表示的循环AE模型和变分循环自动编码器)
2)你的输入维度是1,但是超过100个时间步长。因此您的实际输入尺寸是 100x1。如果您选择 LSTM 中隐藏层的维度为 32,那么您的输入实际上会从 100x1 减少到 32。
如果您仍需要更多信息,有人在 GitHub 上发布了类似的问题。
归档时间: |
|
查看次数: |
6669 次 |
最近记录: |