我正在研究变分自动编码器(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 Layer,如果有必要重复我的样本z。但是如果我不使用RepeatVector Layer,LSTM-Layer会抛出一个错误,因为它需要一个3 dim输入。
2.)我对潜在变量的维数减少并不感到痛苦。因为我的In_dim = 1。究竟是什么减少了?
提前致谢。
答案 0 :(得分:0)
我已经在下面回答了您的问题。我建议多读一些有关LSTM的内容,例如colah's blog post。这将帮助您了解其含义,并且您会看到问题与LSTM网络的内部运作有关。
1)解码LSTM网络需要一些输入,就像您的编码LSTM使用了数据集中的输入数据一样。您可以反馈解码LSTM的输出,我们只需重复编码器的潜在状态即可(就像您的代码段一样)。可能有几种变化,但是似乎大多数作品都使用潜矢量来初始化解码LSTM中的隐藏状态,然后在进一步推出时将输出反馈到输入。 (例如,参见Recurrent AE model for multidimensional time series representation和Variational Recurrent Auto-encoders)
2)您的输入维为1,但超过100个时间步长。因此,您的实际输入尺寸为100x1。如果您在LSTM中将隐藏层的尺寸选择为32,则输入实际上将从100x1减少到32x。
如果您仍然需要更多信息,请有人在GitHub上发布了similar question。