【发布时间】:2018-03-21 01:39:10
【问题描述】:
我正在尝试使用 LSTM 自动编码器以可变长度的序列作为输入进行序列到序列学习,使用以下代码:
inputs = Input(shape=(None, input_dim))
masked_input = Masking(mask_value=0.0, input_shape=(None,input_dim))(inputs)
encoded = LSTM(latent_dim)(masked_input)
decoded = RepeatVector(timesteps)(encoded)
decoded = LSTM(input_dim, return_sequences=True)(decoded)
sequence_autoencoder = Model(inputs, decoded)
encoder = Model(inputs, encoded)
其中inputs 是用 0 填充到相同长度的原始序列数据 (timesteps)。使用上面的代码,输出的长度也是timesteps,但是当我们计算损失函数时,我们只需要输出的第一个Ni元素(其中Ni是输入序列i的长度,不同的长度可能不同序列)。有谁知道有什么好办法吗?
谢谢!
【问题讨论】:
-
您是否尝试用零填充输出?
-
@DanielMöller 输出的长度已经是
timesteps,如果我用零填充它会更长吗? -
对不起,用零填充“目标”。
-
@DanielMöller 是的,这就是我所做的,问题与填充有关。例如,如果一个特定的输入有 5 个元素,当它被送入自动编码器时,它会被填充 5 个零,长度为 10。理想情况下,在计算损失时,我们只需要关心输出的前 5 个元素,但是由于最后 5 个元素的存在(除非它们全为零,这几乎是不可能的),损失会更大。所以我想知道在计算损失时是否可以“屏蔽”输出的最后 5 个元素?
-
现在我明白了……“RepeatVector”之后的另一个 Masking 怎么样?我会写一个选项...
标签: machine-learning deep-learning keras lstm autoencoder