[英]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.