首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将编码器从AutoEncoder连接到LSTM

将编码器从AutoEncoder连接到LSTM
EN

Stack Overflow用户
提问于 2018-09-06 10:06:59
回答 2查看 425关注 0票数 4

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

代码语言:javascript
复制
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层

代码语言:javascript
复制
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])

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

输入0与层lstm_3不兼容:预期的ndim=3,找到ndim=2

我怎么才能做好这件事呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-06 10:58:22

我认为主要的问题产生于这样一个事实:最后一个encoded不是重复的载体。要将编码器输出提供给LSTM,需要通过RepeatVector层发送。换句话说,编码器的最后输出需要有[batch_size, time_steps, dim]形状才能被输入到LSTM中。这大概就是你要找的?

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2018-09-06 10:21:32

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

但是,您想要做的是相同的,就像您对解码器所做的一样:您应用RepeatVector层使输入形状是三维的,因此可以将其输入到LSTM层中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52201643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档