簡體   English   中英

如何使用 Keras 在堆疊的 LSTM 中設置密集瓶頸?

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

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