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

时间:2018-01-30 12:49:35

标签: keras recurrent-neural-network encoder-decoder

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

以下代码似乎正在运作

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中显示src_inputmodel.summary()个图层。新的解码器看起来像:

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_state解码器中传递Bidirectional时,我是否遗漏了某些内容?我怎样才能解决这个问题?有没有其他方法可以使这项工作?

1 个答案:

答案 0 :(得分:1)

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

我在为initial_state实施Bidirectional时并未意识到这一点。它应该在this PR之后立即修复。您可以在GitHub上安装最新的主分支来修复它。