[英]How can I setup a Dense bottleneck in a stacked LSTM with Keras?
我有:
self.model.add(Bidirectional(LSTM(lstm1_size, input_shape=(
seq_length, feature_dim), return_sequences=True)))
self.model.add(BatchNormalization())
self.model.add(Dropout(0.2))
self.model.add(Bidirectional(
LSTM(lstm2_size, return_sequences=True)))
self.model.add(BatchNormalization())
self.model.add(Dropout(0.2))
# BOTTLENECK HERE
self.model.add(Bidirectional(
LSTM(lstm3_size, return_sequences=True)))
self.model.add(BatchNormalization())
self.model.add(Dropout(0.2))
self.model.add(Bidirectional(
LSTM(lstm4_size, return_sequences=True)))
self.model.add(BatchNormalization())
self.model.add(Dropout(0.2))
self.model.add(Dense(feature_dim, activation='linear'))
但是,我想设置一个autoencoder
的设置,而不autoencoder
2 个单独的模型。 在我BOTTLENECK HERE
有评论BOTTLENECK HERE
,我想要一个某些维度的向量,比如bottleneck_dim
。
之后,应该是一些 LSTM 层,然后重建与初始输入具有相同维度的序列。 但是,我相信添加Dense
层不会返回一个向量,而是返回每个序列长度的向量?
Dense
已更新为自动充当好像用TimeDistributed
包裹 - 即你会得到(batch_size, seq_length, lstm2_size)
。Flatten()
,因此Dense
的输出形状将为(batch_size, seq_length * lstm2_size)
。 但是,我不推荐它,因为它可能会破坏时间信息(您正在混合通道和时间步长)。 此外,它将网络限制为seq_length
,因此您不能再对任何其他seq_length
进行训练或推理。 一个首选的替代方法是Bidirectional(LSTM(..., return_sequences=False))
,它只返回最后一个时间步的输出,形状为(batch_size, lstm_bottleneck_size)
。 要将其输出提供给下一个 LSTM,您需要在=False
层之后使用RepeatVector(seq_length)
。
不过,请注意“瓶颈”的程度; 例如,如果(seq_length, feature_dim) = (200, 64)
和lstm_bottleneck_size = 400
,那就是(1 * 400) / (200 * 64)
= x32减少,这是相当大的,并且可能会淹没网络。 我建议以 x8 为目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.