keras - Создание пользовательского повторяющегося слоя Keras дает ошибку initial_state - PullRequest
0 голосов
/ 10 июня 2019

У меня есть проект, чтобы сделать модель для обобщения текста. Я решил использовать модель кодера-декодера, в которой кодер будет использовать двунаправленный GRU, а декодер будет использовать модель внимания GRU и Bahdanau. Я хочу использовать Keras API для моей модели, но у 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.

Надеясь на помощь. Любая идея? Спасибо

...