加入收藏 | 设为首页 | 会员中心 | 我要投稿 阜阳站长网 (https://www.0558zz.com/)- 科技、建站、内容创作、云计算、网络安全!
当前位置: 首页 > 编程开发 > Python > 正文

python – 在keras的LSTM中使用隐藏状态而不是输出

发布时间:2020-09-18 23:07:22 所属栏目:Python 来源:互联网
导读:我希望在 Yang et al.之前使用注意机制的实现.我找到了一个使用此注意机制 here的自定义层的工作实现.而不是使用我的LSTM的输出值: my_lstm = LSTM(128, input_shape=(a, b), return_sequences=True)my_lstm = AttentionWithContext()(my_lstm)out = Dense(2

我希望在 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,return_state=True)
my_lstm = AttentionWithContext()(my_lstm)
out = Dense(2,activation='softmax')(my_lstm)

但我得到错误:

TypeError: can only concatenate tuple (not “int”) to tuple

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

谢谢!

解决方法

我认为你的困惑可能源于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]

该步骤函数的返回类型是输出状态.因此我们可以看到隐藏状态h实际上是输出,对于状态,我们得到隐藏状态h和单元状态c.这就是为什么你可以互换地使用术语“隐藏”和“输出”看到你链接的Wiki article.

看一下你把论文链接得更近一点,在我看来你最初的实现就是你想要的.

my_lstm = LSTM(128,activation='softmax')(my_lstm)

这会将每个时间步的隐藏状态传递给您的注意层.你运气不好的唯一情况是你真正希望将每个时间步的细胞状态传递到你的注意层(这是我最初的想法),但我认为这不是你想要的.您链接的纸张实际上使用GRU图层,该图层没有单元格状态的概念,并且其step函数也将隐藏状态作为输出返回.

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

所以本文几乎肯定是指隐藏状态(也就是输出)而不是细胞状态.

(编辑:阜阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读