keras-使自定义循环Keras层产生initial_state错误

时间:2019-06-10 07:29:35

标签: python keras layer recurrent-neural-network

我有一个项目要为文本摘要建立模型。我决定使用编码器-解码器模型,该编码器将使用双向GRU,而解码器将使用GRU和Bahdanau的注意力模型。我想为模型使用Keras API,但Keras目前没有Attention层。因此,我在Keras中搜索了一个定制的关注层,然后找到了https://github.com/andreyzharkov/keras-monotonic-attention/blob/master/attention_decoder.py。但是,它只能应用于具有相同输入和输出大小的模型。对于我的模型,它在编码器中具有不同的输入,在解码器中具有不同的输出。所以我需要修改它。

我想使该库能够接受2个输入:用于计算注意力得分的编码器输出,以及用于训练解码器的解码器输入。进行一些修改后,即使我已经定义了initial_state函数,它始终会给出get_initial_state错误。

有关详细信息,这是我的修改结果: https://pastebin.com/8HWD7LKf

这是实现:

encoder_inputs = Input(shape=(None, num_encoder_tokens))
encoder = GRU(latent_dim, return_state=True, return_sequences=True)
encoder_rev = GRU(latent_dim, return_state=True, return_sequences=True, go_backwards=True)
encoder_outputs, state_h = encoder(encoder_inputs)
encoder_rev_outputs, state_rev_h = encoder_rev(encoder_inputs)
encoder_outputs_final = tf.concat([encoder_outputs,encoder_rev_outputs], axis=2)
decoder_inputs = Input(shape=(None, num_decoder_tokens))
decoder = AttentionDecoderNew(latent_dim)
decoder_outputs= decoder([encoder_outputs_final,decoder_inputs])

这是错误:

Traceback (most recent call last):
File "contoh_summarization_attention.py", line 180, in <module>
decoder_outputs= decoder([encoder_outputs_final,decoder_inputs])
File "C:\Users\HP\Anaconda3\envs\tensorflow\lib\site-packages\keras\legacy\layers.py", line 536, in __call__
output = super(Recurrent, self).__call__(inputs, **kwargs)
File "C:\Users\HP\Anaconda3\envs\tensorflow\lib\site-packages\keras\engine\base_layer.py", line 457, in __call__
output = self.call(inputs, **kwargs)
File "D:\KULIAH\Semester 8\TA\coba\example rnn keras\attention_nonseq.py", line 159, in call
return super(AttentionDecoderCell, self).call([encoder_output,decoder_input])
File "C:\Users\HP\Anaconda3\envs\tensorflow\lib\site-packages\keras\legacy\layers.py", line 566, in call
' initial states.')
ValueError: Layer has 2 states but was passed 1 initial states.

希望有所帮助。任何想法?谢谢

0 个答案:

没有答案