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

Neural network 如何将LSTM自动编码器应用于变长时间序列数据?,neural-network,deep-learning,keras,lstm,autoencoder,Neural Network,Deep Learning,Keras,Lstm,Autoencoder,我阅读了本教程中的LSTM autoencoder:,并将相应的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)(encode

我阅读了本教程中的LSTM autoencoder:,并将相应的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)
在这个实现中,他们将输入固定为形状(timesteps,input_dim),这意味着时间序列数据的长度固定为
timesteps
。如果我没记错的话,RNN/LSTM可以处理可变长度的时间序列数据,我想知道是否有可能以某种方式修改上面的代码以接受任意长度的数据

谢谢

您可以使用
shape=(无,输入尺寸)

但是,
RepeatVector
需要一些技巧,直接从输入张量中获取维度。(该代码使用tensorflow,但不确定theano)


谢谢您知道如何将不同长度的数据传递到自动编码器中吗?我试图将var-length数组列表转换为array,但失败了。我试图将var-length数组的列表直接传递给它,但在检查模型输入时得到的错误信息是:
error:传递给模型的Numpy数组列表的大小不是模型预期的大小。预计会看到1个数组,但得到了以下3773个数组的列表:[array([[0.300544,0.251966],
。还有一个选项,可以使用虚拟值填充数组,使它们都具有相同的大小,并使用
掩蔽
(我从未使用过它,但你可以在谷歌上搜索如何在keras上使用掩蔽).我注意到另一个问题,每次将一组具有新形状的数据送入自动编码器(for循环)时,误差会突然增大,然后逐渐减小。这是否意味着不同长度的数据的参数应该不同?是否有更好的方法正确“混合”具有不同长度的数据,以便训练结果不太依赖于使用不同长度数据的顺序?要混合它们,可以使用填充+掩蔽和洗牌(这在
fit
中是自动的,但可以通过
shuffle=True
来确保)。不同序列的损耗不同并不罕见。这不一定是因为长度。但你不应该多次训练一个序列,而应该循环序列。每个序列只训练一个历元(我建议
train\u on\u batch
),然后重复所有序列。
import keras.backend as K

def repeat(x):

    stepMatrix = K.ones_like(x[0][:,:,:1]) #matrix with ones, shaped as (batch, steps, 1)
    latentMatrix = K.expand_dims(x[1],axis=1) #latent vars, shaped as (batch, 1, latent_dim)

    return K.batch_dot(stepMatrix,latentMatrix)


decoded = Lambda(repeat)([inputs,encoded])
decoded = LSTM(input_dim, return_sequences=True)(decoded)