【问题标题】:Connect Encoder from AutoEncoder to LSTM将编码器从 AutoEncoder 连接到 LSTM
【发布时间】:2018-09-06 10:06:59
【问题描述】:

我有一个这样定义的自动编码器

inputs = Input(batch_shape=(1,timesteps, input_dim))

encoded = LSTM(4,return_sequences = True)(inputs)
encoded = LSTM(3,return_sequences = True)(encoded)
encoded = LSTM(2)(encoded)
decoded = RepeatVector(timesteps)(encoded) 
decoded =  LSTM(3,return_sequences = True)(decoded)                                   
decoded =  LSTM(4,return_sequences = True)(decoded)
decoded =  LSTM(input_dim,return_sequences = True)(decoded)

sequence_autoencoder = Model(inputs, decoded)

encoder = Model(inputs,encoded)

我希望编码器像这样连接到 LSTM 层

f_input = Input(batch_shape=(1, timesteps, input_dim))

encoder_input = encoder(inputs=f_input)

single_lstm_layer = LSTM(50, kernel_initializer=RandomUniform(minval=-0.05, maxval=0.05))(encoder_input)
drop_1 = Dropout(0.33)(single_lstm_layer)
output_layer = Dense(12, name="Output_Layer"
                         )(drop_1)

final_model = Model(inputs=[f_input], outputs=[output_layer])

但它给了我一个尺寸错误。

Input 0 is incompatible with layer lstm_3: expected ndim=3, found ndim=2

我怎样才能正确地做到这一点。?

【问题讨论】:

  • 编码器的输出(即encoder_input)的形状为(1, 2)。这就是为什么它不能被馈送到下面的 LSTM 层。
  • 是的。那我该怎么办?
  • 我不知道您正在处理的问题是什么以及为什么要这样做,但是如果无论如何要求解决此问题,您必须以某种方式拥有一个形状为 (1, ?, 2) 的张量能够将其馈送到 LSTM 层。为此,一种方法是在encoder_input 上使用RepeatVector 层。但是,这可能适合也可能不适合,具体取决于您正在处理的问题和您想要达到的结果。
  • @today 我正在尝试做这样的事情eng.uber.com/wp-content/uploads/2017/06/…

标签: python keras deep-learning lstm


【解决方案1】:

我认为主要问题在于最后一个 encoded 不是重复向量。要将编码器输出馈送到 LSTM,它需要通过RepeatVector 层发送。换句话说,编码器的最后一个输出需要具有[batch_size, time_steps, dim] 形状才能被馈送到 LSTM。这可能就是您要找的东西?

inputs = Input(batch_shape=(1,timesteps, input_dim))

encoded = LSTM(4,return_sequences = True)(inputs)
encoded = LSTM(3,return_sequences = True)(encoded)
encoded = LSTM(2)(encoded)
encoded_repeat = RepeatVector(timesteps)(encoded) 

decoded =  LSTM(3,return_sequences = True)(encoded_repeat)                                   
decoded =  LSTM(4,return_sequences = True)(decoded)
decoded =  LSTM(input_dim,return_sequences = True)(decoded)

sequence_autoencoder = Model(inputs, decoded)

encoder = Model(inputs,encoded_repeat)

f_input = Input(batch_shape=(1, timesteps, input_dim))

encoder_input = encoder(inputs=f_input)

single_lstm_layer = LSTM(50, kernel_initializer=RandomUniform(minval=-0.05, maxval=0.05))(encoder_input)
drop_1 = Dropout(0.33)(single_lstm_layer)
output_layer = Dense(12, name="Output_Layer"
                         )(drop_1)

final_model = Model(inputs=[f_input], outputs=[output_layer])

我已将您的第一个 decoded 重命名为 encode_repeat

【讨论】:

  • 这就是我要找的。谢谢
【解决方案2】:

您的代码已经给出了答案。 encoder 在其最后一层 lstm 中具有二维 (number_batch, number_features) 而不是 (number_batches, number_timesteps, number_features)。 这是因为您没有设置return_sequences = True(这是您的预期行为)。

但是您想要做的与您对解码器所做的相同:应用 RepeatVector 层以使输入形状为 3 维,因此能够输入到 LSTM 层中。

【讨论】:

  • 那么,我想更改编码器解码器架构。?
  • 是的,如果编码表示是为了在另一个 lstm 层中输入,那么编码为 3 维形状是有意义的。因此,只需将return_sequences = True 放入您的第三个 lstm 层并删除重复向量层。
最近更新 更多