相关疑难解决方法(0)

如何将 LSTM 自动编码器应用于变长时间序列数据?

我在本教程中阅读了 LSTM-autoencoder:https://blog.keras.io/building-autoencoders-in-keras.html,并在下面粘贴相应的 keras 实现:

from keras.layers import Input, LSTM, RepeatVector
from keras.models import Model

inputs = Input(shape=(timesteps, input_dim))
encoded = LSTM(latent_dim)(inputs)

decoded = RepeatVector(timesteps)(encoded)
decoded = LSTM(input_dim, return_sequences=True)(decoded)

sequence_autoencoder = Model(inputs, decoded)
encoder = Model(inputs, encoded)
Run Code Online (Sandbox Code Playgroud)

在此实现中,他们将输入固定为形状 (timesteps, input_dim),这意味着时间序列数据的长度固定为timesteps。如果我没记错的话,RNN/LSTM 可以处理可变长度的时间序列数据,我想知道是否可以以某种方式修改上面的代码以接受任何长度的数据?

谢谢!

neural-network autoencoder deep-learning lstm keras

5
推荐指数
1
解决办法
3487
查看次数

Keras误解了训练数据的形状

我的训练数据的形式(?,15)在哪里?是一个可变长度.

创建模型时,我指定:

inp = Input(shape=(None,15))
conv = Conv1D(32,3,padding='same',activation='relu')(inp)
...
Run Code Online (Sandbox Code Playgroud)

我的训练数据有形状(35730,?,15).

在python中检查这个我得到:

X.shape
Run Code Online (Sandbox Code Playgroud)

产出:(35730,)

X[0].shape
Run Code Online (Sandbox Code Playgroud)

产出:(513,15)

当我尝试将我的模型放在我的训练数据上时,我得到了ValueError:

Error when checking input: expected input_1 to have 3 dimensions, but got array with shape (35730, 1)
Run Code Online (Sandbox Code Playgroud)

我只能通过在单个样本上使用model.train_on_batch()来训练我的模型.

我怎么解决这个问题?似乎keras认为输入数据的形状是(35730,1),实际上是(35730,?,15)

这是keras中的错误还是我做错了什么?

如果重要的话,我正在使用tensorflow后端.这是keras 2

python keras tensorflow

4
推荐指数
1
解决办法
1944
查看次数

如何屏蔽具有 RepeatVector() 层的 LSTM 自动编码器中的输入?

我一直在尝试使用 LSTM 自动编码器获得向量序列的向量表示,以便我可以使用 SVM 或其他此类监督算法对序列进行分类。数据量使我无法使用完全连接的密集层进行分类。

我输入的最短大小是 7 个时间步,最长的序列是 356 个时间步。因此,我用零填充较短的序列以获得形状为 (1326, 356, 8) 的最终 x_train,其中 1326 是训练样本的数量,8 是一个时间步长的维度。我正在尝试使用给定的 LSTM 自动编码器将这些序列编码为单个向量。

model.add(Masking(mask_value=0.0, input_shape=(max_len, 8)))
model.add(LSTM(100, activation='relu'))
model.add(RepeatVector(max_len))
model.add(LSTM(8, activation='relu', return_sequences=True))
model.compile(optimizer='adam', loss='mse')
model.fit(x_train, x_train, batch_size=32, callbacks=[chk], epochs=1000, validation_split=0.05, shuffle=True)
Run Code Online (Sandbox Code Playgroud)

我试图掩盖零填充的结果,但 RepeatVector() 层可能会阻碍这个过程。因此,一段时间后,均方误差损失变为nan。任何人都可以帮助我了解如何在计算损失函数时仅包含相关时间步长而忽略其他时间步长?

masking lstm keras

3
推荐指数
1
解决办法
1471
查看次数