【问题标题】:how could i get both the final hidden state and sequence in a LSTM layer when using a bidirectional wrapper使用双向包装器时,如何在 LSTM 层中同时获得最终的隐藏状态和序列
【发布时间】:2018-03-16 05:17:39
【问题描述】:

我已按照https://machinelearningmastery.com/return-sequences-and-return-states-for-lstms-in-keras/ 中的步骤进行操作 但是当涉及到双向 lstm 时,我尝试了这个

lstm, state_h, state_c = Bidirectional(LSTM(128, return_sequences=True, return_state= True))(input)

但它不会起作用。

当使用双向包装器时,是否有一些方法可以在 LSTM 层中同时获得最终隐藏状态和序列

【问题讨论】:

  • 双向包装器创建给定层的两个副本,forward_layerbackward_layer。我现在无法检查它,但我很确定你可以使用 my_bidirectional_layer.forward_layer.states 或类似的东西获得隐藏状态。
  • 你使用哪个 Keras 版本?
  • 2.1.5 keras 和 1.4.0 tensorflow 后端

标签: python deep-learning keras


【解决方案1】:

调用 Bidirectional(LSTM(128, return_sequences=True, return_state=True))(input) 返回 5 个张量:

  1. 隐藏状态的整个序列,默认情况下它将是前向和后向状态的串联。
  2. 前向 LSTM 的最后一个隐藏状态 h
  3. 前向 LSTM 的最后一个单元状态 c
  4. 后向 LSTM 的最后一个隐藏状态 h
  5. 后向 LSTM 的最后一个单元状态 c

您发布的行会引发错误,因为您只想将返回的值解压缩为三个变量 (lstm, state_h, state_c)。

要更正它,只需将返回值解压缩为 5 个变量。如果你想合并状态,你可以用Concatenate层连接前向和后向状态。

lstm, forward_h, forward_c, backward_h, backward_c = Bidirectional(LSTM(128, return_sequences=True, return_state=True))(input)
state_h = Concatenate()([forward_h, backward_h])
state_c = Concatenate()([forward_c, backward_c])

【讨论】:

  • 当你说1是隐藏状态的整个序列时,你的意思是(在串联的情况下)是2后跟4吗?
  • @Michaela 不。如果输入是长度为 T 的序列,那么 1 也将是长度为 T 的序列。另一方面,2 和 4 的长度都为 1,它们是单个时间步的输出。
  • 我意识到在我的应用程序中,return_sequences=False,所以没关系,很抱歉造成混淆:)
  • 谁能提供这个文件,我找了没找到,谢谢
猜你喜欢
  • 2020-07-15
  • 2022-09-23
  • 2022-12-04
  • 2021-04-14
  • 2021-11-25
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多