将initial_state传递给 Keras 中的双向 RNN 层



我正在尝试使用双向GRU在Keras中实现编码器-解码器类型的网络。

以下代码似乎有效

src_input = Input(shape=(5,))
ref_input = Input(shape=(5,))
src_embedding = Embedding(output_dim=300, input_dim=vocab_size)(src_input)
ref_embedding = Embedding(output_dim=300, input_dim=vocab_size)(ref_input)
encoder = Bidirectional(
GRU(2, return_sequences=True, return_state=True)
)(src_embedding)
decoder = GRU(2, return_sequences=True)(ref_embedding, initial_state=encoder[1])

但是当我将解码更改为使用Bidirectional包装器时,它停止显示encoder并在model.summary()src_input层。新的解码器如下所示:

decoder = Bidirectional(
GRU(2, return_sequences=True)
)(ref_embedding, initial_state=encoder[1:])

使用双向解码器model.summary()的输出。

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (InputLayer)         (None, 5)                 0         
_________________________________________________________________
embedding_2 (Embedding)      (None, 5, 300)            6610500   
_________________________________________________________________
bidirectional_2 (Bidirection (None, 5, 4)              3636      
=================================================================
Total params: 6,614,136
Trainable params: 6,614,136
Non-trainable params: 0
_________________________________________________________________

问:当我在解码器中传递initial_stateBidirectional我是否遗漏了什么?我该如何解决这个问题?还有其他方法可以做到这一点吗?

这是一个错误。RNN层实现__call__,以便可以将initial_state中的张量收集到模型实例中。但是,Bidirectional包装器没有实现它。因此,关于initial_state张量的拓扑信息丢失了,并且发生了一些奇怪的错误。

当我为Bidirectional实施initial_state时,我没有意识到这一点。在此 PR 之后,现在应该修复它。您可以在 GitHub 上安装最新的主分支来修复它。

相关内容

  • 没有找到相关文章

最新更新