LSTM时间序列上的自动编码器

Hit*_*uca 5 python autoencoder lstm keras

我目前正在尝试实现一种LSTM自动编码器,以便将事务时间序列(Berka数据集)压缩为较小的编码向量。我正在使用的数据看起来像这样 (这是单个帐户在整个时间内的累计余额)。

我决定使用Keras,并尝试按照教程创建一个简单的自动编码器。该模型不起作用。

我的代码是这样的:

import keras
from keras import Input, Model
from keras.layers import Lambda, LSTM, RepeatVector
from matplotlib import pyplot as plt
from scipy import io
from sklearn.preprocessing import MinMaxScaler
import numpy as np

class ResultPlotter(keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs={}):
        plt.subplots(2, 2, figsize=(10, 3))
        indexes = np.random.randint(datapoints, size=4)
        for i in range(4):
            plt.subplot(2, 2, i+1)
            plt.plot(sparse_balances[indexes[i]])
            result = sequence_autoencoder.predict(sparse_balances[0:1])
            plt.plot(result.T)
            plt.xticks([])
            plt.yticks([])
        plt.tight_layout()
        plt.show()
        return

result_plotter = ResultPlotter()

sparse_balances = io.mmread("my_path_to_sparse_balances.mtx")
sparse_balances = sparse_balances.todense()
scaler = MinMaxScaler(feature_range=(0, 1))
sparse_balances = scaler.fit_transform(sparse_balances)

N = sparse_balances.shape[0]
D = sparse_balances.shape[1]


batch_num = 32
timesteps = 500
latent_dim = 32
datapoints = N

model_inputs = Input(shape=(timesteps,))
inputs = Lambda(lambda x: keras.backend.expand_dims(x, -1))(model_inputs)
encoded = LSTM(latent_dim)(inputs)
decoded = RepeatVector(timesteps)(encoded)
decoded = LSTM(1, return_sequences=True)(decoded)
decoded = Lambda(lambda x: keras.backend.squeeze(x, -1))(decoded)
sequence_autoencoder = Model(model_inputs, decoded)
encoder = Model(model_inputs, encoded)

earlyStopping = keras.callbacks.EarlyStopping(monitor='loss', patience=5, verbose=0, mode='auto')

sequence_autoencoder.compile(loss='mean_squared_error', optimizer='adam')

sequence_autoencoder.fit(sparse_balances[:datapoints], sparse_balances[:datapoints],
                         batch_size=batch_num, epochs=100,
                        callbacks=[earlyStopping, result_plotter])
Run Code Online (Sandbox Code Playgroud)

我没有添加用于生成sparse_balanced.mtx的代码,以使所有内容保持清晰,请随时提出要求,我将其发布。

问题在于自动编码器似乎卡在了预测单行上,而不是返回紧随输入趋势的输出,但是经过大量研究后,我仍然必须找到一种解决方案。我使用密集层作为模型的潜在输出部分进行了一些实验,它可以返回更好的结果

然后的问题是:鉴于事实,通过使用LSTM-> Dense或Dense-> Dense自动编码器,我可以得到不错的结果,而使用Dense-> LSTM和LSTM-> LSTM结果却具有相同的错误预测,我的模型,概念还是其他问题?

每个评论都非常感谢,谢谢。

Hit*_*uca 2

问题是我的数据集太小众,无法轻松地由 LSTM 自动编码。我目前正在写关于交易生成主题的硕士论文,我详细分析了这个问题。如果您不特别使用此数据集,我建议尝试使用一些与时间相关的合成数据,例如正弦波、锯齿波等,因为模型应该能够正确工作。如果它仍然不起作用,可能您的代码中有一些错误。