将 initial_state 传递给 Keras 中的双向 RNN 层
Passing initial_state to Bidirectional RNN layer in Keras
我正在尝试使用双向 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
包装器时,它停止显示 model.summary()
中的 encoder
和 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
_________________________________________________________________
问题:当我在Bidirectional
解码器中通过initial_state
时,我是否遗漏了什么?我怎样才能解决这个问题?有没有其他方法可以做到这一点?
这是一个错误。 RNN
层实现了 __call__
以便可以将 initial_state
中的张量收集到模型实例中。但是,Bidirectional
包装器没有实现它。所以关于 initial_state
张量的拓扑信息丢失了,一些奇怪的错误发生了。
我在为 Bidirectional
实施 initial_state
时并没有意识到这一点。它现在应该在 this PR 之后修复。您可以在 GitHub 安装最新的 master 分支来修复它。
我正在尝试使用双向 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
包装器时,它停止显示 model.summary()
中的 encoder
和 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
_________________________________________________________________
问题:当我在Bidirectional
解码器中通过initial_state
时,我是否遗漏了什么?我怎样才能解决这个问题?有没有其他方法可以做到这一点?
这是一个错误。 RNN
层实现了 __call__
以便可以将 initial_state
中的张量收集到模型实例中。但是,Bidirectional
包装器没有实现它。所以关于 initial_state
张量的拓扑信息丢失了,一些奇怪的错误发生了。
我在为 Bidirectional
实施 initial_state
时并没有意识到这一点。它现在应该在 this PR 之后修复。您可以在 GitHub 安装最新的 master 分支来修复它。