代码之家  ›  专栏  ›  技术社区  ›  Sreeram TP

将编码器从自动编码器连接到LSTM

  •  4
  • Sreeram TP  · 技术社区  · 7 年前

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

    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
    

    我怎样才能做好这件事。?

    2 回复  |  直到 7 年前
        1
  •  3
  •   thushv89    7 年前

    我认为主要的问题是因为最后一个 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
  •  1
  •   dennis-w    7 年前

    你的代码已经给出了答案。 encoder 在其最后一层中具有二维的lstm(number\u batch,number\u features),而不是(number\u batches,number\u timesteps,number\u features)。 这是因为你没有 return_sequences = True

    但是你想做的和你用解码器做的是一样的:你应用RepeatVector层使输入的形状是三维的,因此可以输入到LSTM层。