将初始状态传递到 Keras 中的双向 RNN 层

nis*_*eri 5 keras recurrent-neural-network encoder-decoder

我正在尝试使用双向 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])
Run Code Online (Sandbox Code Playgroud)

但是,当我将解码更改为使用Bidirectional包装器时,它会停止显示encodersrc_inputmodel.summary(). 新的解码器如下所示:

decoder = Bidirectional(
                GRU(2, return_sequences=True)
        )(ref_embedding, initial_state=encoder[1:])
Run Code Online (Sandbox Code Playgroud)

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
_________________________________________________________________
Run Code Online (Sandbox Code Playgroud)

问题:当我传入解码器时,我是否遗漏了一些initial_state东西Bidirectional?我怎样才能解决这个问题?还有其他方法可以使这项工作有效吗?

Yu-*_*ang 1

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

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