【问题标题】:Use hidden states instead of outputs in LSTMs of keras在 keras 的 LSTM 中使用隐藏状态而不是输出
【发布时间】:2018-01-20 10:13:43
【问题描述】:

我想使用Yang et al. 的注意力机制实现。我找到了一个使用这种注意力机制here 的自定义层的工作实现。而不是使用我的 LSTM 的输出值:

my_lstm = LSTM(128, input_shape=(a, b), return_sequences=True)
my_lstm = AttentionWithContext()(my_lstm)
out = Dense(2, activation='softmax')(my_lstm)

我想使用 LSTM 的隐藏状态:

my_lstm = LSTM(128, input_shape=(a, b), return_state=True)
my_lstm = AttentionWithContext()(my_lstm)
out = Dense(2, activation='softmax')(my_lstm)

但我得到了错误:

TypeError:只能将元组(不是“int”)连接到元组

我尝试将它与 return_sequences 结合使用,但到目前为止我尝试过的一切都失败了。如何修改返回的张量以便像返回的输出序列一样使用它?

谢谢!

【问题讨论】:

  • return_state=True 只返回最后一个隐藏状态,而不是所有隐藏状态。因此,即使您编辑了 AttentionWithContext 以使用 return_state=True 时获得的张量列表,我认为这不会是您想要的。
  • @NicoleWhite 好的,那会是个问题。我看不出它只返回最后一个隐藏状态的原因,但就这样吧。不过我不得不怀疑:在大多数论文中,他们都在谈论隐藏状态。这真的是他们的意思还是他们只是使用了错误的术语?我没有看到使用隐藏状态而不是输出状态的理由,但我想正确使用他们的方法。
  • 你说的输出状态指的是什么?
  • @NicoleWhite 我使用来自here 的术语来表示传统的 LSTM。在这种情况下,我们有细胞状态向量和输出向量。我会称细胞状态向量为隐藏状态,但我不确定。

标签: python neural-network deep-learning keras lstm


【解决方案1】:

我认为您的困惑可能源于 Keras 文档有点不清楚。

return_sequences: Boolean. Whether to return the last output in the output sequence, or the full sequence.
return_state: Boolean. Whether to return the last state in addition to the output.

return_state 上的文档特别令人困惑,因为它们暗示隐藏状态与输出不同,但它们是相同的。对于 LSTM,这有点模糊,因为除了隐藏(输出)状态之外,还有单元状态。我们可以通过查看 Keras 代码中的 LSTM 步进函数来确认这一点:

class LSTM(Recurrent):
    def step(...):
        ...
        return h, [h, c]

此步进函数的返回类型为output, states。所以我们可以看到隐藏状态h实际上是输出,对于这些状态我们得到隐藏状态h和细胞状态c。这就是为什么您看到您链接的Wiki article 交替使用术语“隐藏”和“输出”。

看看你链接得更近一点的论文,在我看来你的原始实现就是你想要的。

my_lstm = LSTM(128, input_shape=(a, b), return_sequences=True)
my_lstm = AttentionWithContext()(my_lstm)
out = Dense(2, activation='softmax')(my_lstm)

这会将每个时间步的隐藏状态传递给您的注意力层。您不走运的唯一情况是您实际上想要将每个时间步的单元状态传递到您的注意力层(这是我最初的想法),但我认为这不是您想要的。您链接的论文实际上使用了一个 GRU 层,它没有单元状态的概念,其步骤函数也返回隐藏状态作为输出。

class GRU(Recurrent):
    def step(...):
        ...
        return h, [h]

所以这篇论文几乎可以肯定是指隐藏状态(也就是输出)而不是细胞状态。

【讨论】:

  • 我刚刚再次浏览论文,也注意到他们使用 GRU。我对他们不够熟悉,不知道他们不使用细胞状态。因为我认为它们是指论文中 GRU 的单元状态,所以我实际上想为我的注意力层获取 LSTM 的单元状态。现在我知道 GRU 和 Yang 等人没有细胞状态。只能表示输出(或隐藏向量)。非常感谢您的宝贵时间和帮助!
  • @Nicole White,感谢您的解释。在您的解决方案中,有没有办法将隐藏状态(即输出)写入文件而不是将它们输入注意力层?感谢您对此的任何想法!
  • 能否为您的代码 sn-ps 提供 github 行的链接?
  • 随着项目的更新,代码库中一行的链接可能会过时。我认为如果有人在代码库中搜索 GRU 类会更好。
【解决方案2】:

只是为了给妮可的回答加一分 -

如果我们在 LSTM 中使用 return_state = Truereturn_sequences = True 的组合,那么第一个 [h] 将在每个时间步(向量)返回隐藏状态,也就是输出,而第二个 [h] 将在最后一个时间步返回隐藏状态(标量)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 2019-07-17
  • 1970-01-01
相关资源
最近更新 更多