【问题标题】:How can I setup a Dense bottleneck in a stacked LSTM with Keras?如何使用 Keras 在堆叠的 LSTM 中设置密集瓶颈?
【发布时间】:2020-02-25 13:34:26
【问题描述】:

我有:

        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 的设置,而不必拥有 2 个单独的模型。在我有评论 BOTTLENECK HERE 的地方,我想要一个维度的向量,比如 bottleneck_dim

之后,应该是一些 LSTM 层,然后重建一个与初始输入具有相同维度的序列。但是,我相信添加Dense 层不会返回一个向量,而是返回每个序列长度的向量?

【问题讨论】:

    标签: python tensorflow keras lstm autoencoder


    【解决方案1】:
    • 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 为目标。

    【讨论】:

    • 那么我有BOTTLENECK HERE,你是说我的lstm2 应该改为简单的return_sequences=False?这会很容易地输入到下一个 LSTM 层吗?
    • 其次,压缩到瓶颈然后重建它有什么好处吗?还是我最好直接做 seq2seq?
    • seq2seq 应该更容易训练更长的时间步,因为损失会直接影响每个时间步的梯度,尽管它也取决于您的 regularization。不过,您可以同时尝试两者,只需将其与固定压缩比进行公平比较即可。自动编码器的想法是对编码器施加某种形式的约束,以学习鲁棒/有用的表示——维度就是其中之一;其他包括去噪(GaussianNoise,输入丢失),稀疏性(SpatialDropout)。
    • 能否说明RepeatVector的作用?现在,我将提供 seq_length 的相同向量,而不是提供 1 个向量?
    • 如何指定lstm_bottleneck_size
    猜你喜欢
    • 2019-08-02
    • 1970-01-01
    • 2017-03-12
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 2018-04-29
    相关资源
    最近更新 更多