簡體   English   中英

將編碼器從AutoEncoder連接到LSTM

[英]Connect Encoder from AutoEncoder to 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)
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 

我該怎么做呢?

我認為主要問題來自於最后一次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])

我已經改名為你的第一個decodedencode_repeat

你的代碼已經給出了答案。 encoder在其最后一層lstm中具有兩個維度(number_batch,number_features)而不是(number_batches,number_timesteps,number_features)。 這是因為你沒有設置return_sequences = True (這是你的預期行為)。

但是你想要做的是和你的解碼器一樣:你應用RepeatVector層使輸入形狀為3維,因此能夠被裝入LSTM層。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM