如何将 LSTM 自动编码器应用于变长时间序列数据?
How to apply LSTM-autoencoder to variant-length time-series data?
我阅读了本教程中的 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)
在此实现中,他们将输入固定为形状(时间步长,input_dim),这意味着时间序列数据的长度固定为timesteps
。如果我没记错的话 RNN/LSTM 可以处理可变长度的时间序列数据,我想知道是否可以以某种方式修改上面的代码以接受任何长度的数据?
谢谢!
您可以使用shape=(None, input_dim)
但是 RepeatVector
需要一些黑客技术直接从输入张量中获取维度。 (该代码使用tensorflow,不确定theano)
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)
我阅读了本教程中的 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)
在此实现中,他们将输入固定为形状(时间步长,input_dim),这意味着时间序列数据的长度固定为timesteps
。如果我没记错的话 RNN/LSTM 可以处理可变长度的时间序列数据,我想知道是否可以以某种方式修改上面的代码以接受任何长度的数据?
谢谢!
您可以使用shape=(None, input_dim)
但是 RepeatVector
需要一些黑客技术直接从输入张量中获取维度。 (该代码使用tensorflow,不确定theano)
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)