1

我正在尝试使用自动编码器来获取时间序列并重建它。我的数据有 10 个长度为 365 和一维的时间序列,回溯窗口为 28 天。Autoencoder 模型基于这个keras 博客. 所以基本上这个模型应该得到一个由 28 个值组成的序列,并尝试将它们重建为结果。正如您在代码中看到的那样,我训练了模型,然后给了它 100 个序列作为测试。然后我尝试绘制每个序列步骤的结果值(见图)。我想看看这 28 个时间步是如何构造的。所以在图片中你可以看到它们每个的 28 个图(蓝线是真实/预期值,橙色线是重建结果)。对于第一个时间步,它总是很糟糕并且几乎是一个恒定值,然后在接下来的时间步中它会变得越来越好,而对于最后一个时间步,它几乎能够重建真实值。这是怎么回事?我希望在所有时间步长上看到相同的模式。您如何解释这些图以及 Autoencoder 在这里的工作方式?

seq_len = 28
n_features = 1
enc_hunits = 14
data.shape = (5642, 28, 1)

inputEncoder = Input(shape=(seq_len, n_features), name='inputEncoder')
outEncoder = LSTM(enc_hunits, name='outputEncoder')(inputEncoder)
encoder_model = Model(inputEncoder, outEncoder)

c = RepeatVector(seq_len/enc_hunits, name='inputDecoder')(outEncoder)
c_reshaped = Reshape((seq_len, n_features), name='ReshapeLayer')(c)

outDecoder = LSTM(1, return_sequences=True, name='decoderLSTM')(c_reshaped)
autoencoder = Model(inputEncoder, outDecoder)

autoencoder.compile(loss='mse', optimizer='rmsprop')
history = autoencoder.fit(data, data,
                          validation_split=validation_split_ratio,
                          epochs=epochs,
                          )

test = data[:100, :, :]  # get 100 examples from training
result = autoencoder.predict(test)
#....
plot_results(test, result, n_ts=seq_len)


def plot_results(exp, rec, n_ts=28):
    fig = pyplot.figure(figsize=(30, 30))
    fig.subplots_adjust(hspace=0.32, wspace=0.15)
    count = 1
    for irow in range(n_ts):
        ax = fig.add_subplot(n_ts/2, 2, count)
        ax.plot(exp[:, irow], "--", marker='o', label="Input")
        ax.plot(rec[:, irow], marker='o', label="Reconstructed", linewidth=3, alpha=0.5)
        ax.set_title("{:}th timestep".format(irow))
        ax.legend()
        count += 1
    pyplot.legend()
    pyplot.savefig("all_timesteps.png")
    pyplot.clf()

更新:如果我删除 Reshape 线并且只有 RepeatVector 重复 seq_len 次,会有什么区别,如下所示: c = RepeatVector(seq_len, name='inputDecoder')(outEncoder) 。所以在我的情况下,它将重复向量 28 次而不是 2 次。这将如何影响解码器输入?我尝试了它并再次绘制了所有时间步,这次没有一个时间步被正确重建。第一个情节与这里的图片中的第一个情节相同,其余的与图片中的第二个情节几乎相同。我想知道为什么?

在此处输入图像描述

4

1 回答 1

2

自编码器使用 28 个时间步进行预测。

seq_length = 28

在您的第 0 次临时,它只有该时间步可用。这就是导致您看到的结果的原因。

理想情况下,您应该在 27 日之后开始预测时间步长,以便自动编码器具有完整的序列长度来预测。

于 2018-07-20T10:21:10.587 回答