【问题标题】:How to build a Dense layer for every timestamp of a RNN and feedback every Dense's output into RNN?如何为 RNN 的每个时间戳构建一个 Dense 层,并将每个 Dense 的输出反馈到 RNN 中?
【发布时间】:2017-06-12 05:05:10
【问题描述】:

enter image description here

如图所示,我需要获取每个 Lstm 时间戳的状态并将它们应用到密集层以进行监督学习。然后将这个密集层的输出与 Lstm 的下一个时间戳的状态一起使用。一般来说,我想对 RNN 的每一步都应用监督学习,并将输出反馈到下一个时间戳。如何在 Keras 中实现此功能?

【问题讨论】:

    标签: keras lstm


    【解决方案1】:

    您可能希望在 Dense 层中使用 TimeDistributed 包装器和 LSTM 层中的 stateful 设置的组合。但是,从您发布的图表来看,您似乎没有将密集层的输出用于您的下一个 LTSM。你确定是这样吗?

    编辑:

    根据this discussion,似乎无法直接在 Keras 中实现这一点。这是他们的建议:

    基本上,您尝试做的事情在 Keras 中是不可能的,除非使用像 @nzw0301 建议的解决方法。

    原因是要将当前时间步的输出用作下一个时间步的输入,您基本上需要“深度优先”,即为所有层计算一个时间步,然后计算下一个时间步,依此类推在。然而,Keras 所做的是计算一层的所有时间步,然后再将输出馈送到下一层。

    我相信有三种方法可以解决这个问题:

    提供一个不完整的序列,如 @nzw0301 建议的那样,只查看您感兴趣的输出的时间步长。这在计算上效率不高,但应该可以。

    制作一个自定义层。这一层将在一个时间步使用其输出作为下一个时间步的输入。但是,请注意,这将仅限于这一层,即您不能应用多个层然后以这种方式获得输出。 https://github.com/farizrahman4u/seq2seq/blob/master/seq2seq/models.py#L93 是旧 Keras 版本的实现,它执行类似的操作。

    使用有状态的 RNN (stateful=True) 并让它们一次只读取一个时间步。有状态意味着它们在序列之间保持隐藏状态,因此它应该像“正常” RNN/LSTM 一样有效地工作,除了您只输入长度为 1 的序列。(然后您可以解释输出并计算下一个输入时间步长。)不过,到目前为止,我自己从未尝试过这种方式。

    【讨论】:

    • 感谢您的回复。可能是我的图表有点混乱,但我需要使用 Dense 的输出到 LSTM 层的下一步。而且我认为有状态不适合我的情况。对于有状态的可以知道批次之间相同样本索引的状态,但我需要的是在完全相同的批次和相同的样本中将密集层的输出用于我的 LSTM 层的下一个时间步长。我同意你使用 TimeDistributed 包装器,但是如何将 Dense 层的输出应用到 LSTM 的下一步?
    • 编辑了我的答案!
    • 非常感谢!这个讨论真的很有用。
    • 很高兴能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多