我当前正在尝试实现用于使用LSTM自动编码器,以便将Transactions Limeseries(Berka DataSet(压缩到一个较小的编码向量中。我正在使用的数据看起来像这样(这是整个帐户的累积平衡(。
我决定使用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])
我没有添加用于生成sparse_balenced.mtx的代码,以保持所有内容清晰,请随时要求它,我将发布它。
问题在于,自动编码器似乎被困在预测一条线上,而不是返回输出的输出,这些输出遵循输入的趋势,但是经过广泛的研究,我仍然必须找到解决方案。我使用密集层作为模型的潜在部分进行了一些实验,并且能够返回更好的结果。
那么问题是:鉴于一个事实,即通过使用LSTM->密集或密集 ->密集的自动编码器,我能够获得体面的结果,并使用密集 -> lstm和LSTM--> lstm中的结果相同的不良预测结果,在我的模型中,概念或其他地方的问题?
每个评论都非常感谢,谢谢。
问题是我的数据集太过小众,无法通过LSTMS轻松自动编码。我目前正在撰写有关交易生成主题的硕士论文,并详细分析了这个问题。如果您不特别使用此数据集,我建议尝试使用一些与时间相关的数据,例如正弦波,锯齿波等。因为该模型应该能够正确地工作。如果它仍然不起作用,则您的代码中有一些错误。