调整LSTM自动编码器性能

2024-09-28 01:28:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图建立一个多维时间序列的自动编码器。我跟踪了互联网上各种各样的模板,但是它们都关注于如何运行它,但是还没有找到一个关于如何运行并获得一些有意义的结果的模板。你知道吗

我从这里开始学习教程:https://blog.keras.io/building-autoencoders-in-keras.html;这里是一个实际的例子:https://machinelearningmastery.com/lstm-autoencoders/。你知道吗

import numpy as np
from keras.models import Sequential
from keras.layers import LSTM, RepeatVector
import matplotlib.pyplot as plt

# this sequence comes out of a MinMaxScaler. A separate question is if this was a good idea?
sequence = np.array([[0.63306452, 0.00714286],
       [0.42069892, 0.        ],
       [0.36155914, 0.15      ],
       [0.53629032, 0.12142857],
       [0.32526882, 0.24285714],
       [0.26344086, 0.52142857],
       [0.        , 0.79285714],
       [0.49731183, 0.71428571],
       [0.60080645, 0.25714286],
       [0.63037634, 0.11428571],
       [0.70698925, 0.26428571],
       [0.71774194, 0.21428571],
       [0.6155914 , 0.10714286],
       [0.56451613, 0.36428571],
       [0.66397849, 0.2       ],
       [0.76344086, 0.17857143],
       [0.66801075, 0.07142857],
       [0.66935484, 0.02857143],
       [0.90725806, 0.32857143],
       [1.        , 0.28571429],
       [1.        , 0.4       ],
       [0.81451613, 0.47857143],
       [0.41532258, 0.52142857],
       [0.55107527, 0.63571429],
       [0.42741935, 0.40714286],
       [0.56989247, 0.75      ],
       [0.76075269, 0.55      ],
       [0.69758065, 0.58571429],
       [0.73521505, 0.89285714],
       [0.77150538, 1.        ]])

n_in = len(sequence)
dim_in = sequence.shape[1]
latent_dim = 10
sequence = sequence.reshape((1, n_in, dim_in))

model = Sequential()
model.add(LSTM(latent_dim, input_shape=(n_in, dim_in)))
model.add(RepeatVector(n_in))
model.add(LSTM(dim_in, return_sequences=True))
model.compile(optimizer='adam', loss='mse')
model.summary()

model.fit(sequence, sequence, epochs=1000, verbose=0)

yhat = model.predict(sequence, verbose=0)

plt.figure(1)
plt.subplot(221)
plt.plot(sequence[0, :, 0])
plt.subplot(223)
plt.plot(yhat[0, :, 0])
plt.subplot(222)
plt.plot(sequence[0, :, 1])
plt.subplot(224)
plt.plot(yhat[0, :, 1])

我得到的结果不令人满意(实际值在上行;自动编码器输出在下行): Actuals (upper row); autoencoder output (lower row)

解码后的序列缺少一些重要的特征(如右侧的尖峰或左侧的下降)。考虑到30:10的“压缩比”,我希望这些事件能以某种方式反映出来。我试过玩历元,批量大小,各种激活和损失。你知道吗

  1. 有什么明显的遗漏吗?你知道吗
  2. 我想在一个更大的序列上运行它(5000个时间点,每个点都有可能是高维的)。有什么建议吗?你知道吗
  3. 我应该完全改变我的方法吗?这篇博文的作者https://towardsdatascience.com/autoencoders-for-the-compression-of-stock-market-data-28e8c1a2da3e也没有让它与LSTM一起工作。。。你知道吗

Tags: inhttpsimportaddmodelplotplt序列

热门问题