【发布时间】:2017-06-12 05:05:10
【问题描述】:
如图所示,我需要获取每个 Lstm 时间戳的状态并将它们应用到密集层以进行监督学习。然后将这个密集层的输出与 Lstm 的下一个时间戳的状态一起使用。一般来说,我想对 RNN 的每一步都应用监督学习,并将输出反馈到下一个时间戳。如何在 Keras 中实现此功能?
【问题讨论】:
如图所示,我需要获取每个 Lstm 时间戳的状态并将它们应用到密集层以进行监督学习。然后将这个密集层的输出与 Lstm 的下一个时间戳的状态一起使用。一般来说,我想对 RNN 的每一步都应用监督学习,并将输出反馈到下一个时间戳。如何在 Keras 中实现此功能?
【问题讨论】:
您可能希望在 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 的序列。(然后您可以解释输出并计算下一个输入时间步长。)不过,到目前为止,我自己从未尝试过这种方式。
【讨论】: