Ошибка при отключении графика при попытке построить модель кодера-декодера в Keras

Я пытаюсь реализовать в Керасе упрощенную версию модели кодер-декодер, основанную на изображении, приведенном на рисунке ниже (источник: https://arxiv.org/pdf/1805.07685.pdf). Обратите внимание, что в этой модели только один кодер и декодер, они были раскручены на изображении для ясности.

Я концентрируюсь только на нижней ветви и пока не обращаю внимания на ярлык стиля s_i. Я следовал этому руководству Keras по моделям seq2seq для руководства. Вот мой сценарий, где я определяю эту модель.

Обучение проходит успешно, но я получаю ошибки ниже на этапе вывода.

Traceback (most recent call last):
File "/run_model.py", line 110, in <module>
decoded_sentence = benchmark_obj.inference(test_encoded, id2word, max_sequence_length)
File "/benchmark_model.py", line 173, in inference
encoder_inference = Model(self.encoder_inputs, self.encoder_states)
File "/python3.6/site-packages/keras/legacy/interfaces.py", line 91, in wrapper
return func(*args, **kwargs)
File "/python3.6/site-packages/keras/engine/network.py", line 91, in __init__
self._init_graph_network(*args, **kwargs)
File "/python3.6/site-packages/keras/engine/network.py", line 235, in _init_graph_network
self.inputs, self.outputs)
File "/python3.6/site-packages/keras/engine/network.py", line 1489, in _map_graph_network
str(layers_with_complete_input))
ValueError: Graph disconnected: cannot obtain value for tensor Tensor("decoder_inputs_forward:0", shape=(?, 1, 13105), dtype=float32) at layer "decoder_inputs_forward". The following previous layers were accessed without issue: ['encoder_inputs']

Во время вывода я создаю новый кодер и декодер, согласно учебнику, с теми же весами, что и обученные. Тем не менее, я не включаю обратную часть передачи, так как это было только для обучения модели. Я предполагаю, что это является причиной проблемы, потому что во время обучения кодер и декодер почти циклически связаны, но во время вывода я хочу сосредоточиться только на прямой передаче.

Однако я не уверен, как мне следует решить эту проблему. Я подумал, что, возможно, мне следует создать два независимых кодера / декодера для частей передачи вперед и назад и попросить их разделить веса, но не уверен, что это разумно. Я новичок в Keras, поэтому объяснения без предположений были бы очень благодарны. Благодарю.

Некоторый дополнительный контекст, который может помочь:

Я пытаюсь передать стиль текста. У меня есть два непараллельных корпуса для стилей A и B, и, следовательно, это неконтролируемая проблема. Вот почему декодер во время прямой передачи использует вывод на временном шаге t-1 в качестве входа на временном шаге t. Однако во время обратной передачи декодер стремится восстановить исходное предложение и поэтому использует основную правду в качестве входных данных. Таким образом создаются два входных слоя декодера.

Обновить:

Я решил эту конкретную ошибку. Оказалось, что я перезаписывал вывод из кодировщика (self.encoder_states) во время прямой передачи с выходом из кодировщика во время обратной передачи. Кодер обратной передачи принимает входной сигнал от декодера, который не был передан. Вместо этого я вызывал модель (self.encoder_inputs, self.encoder_states).

Исходя из этого, мне интересно, является ли выбранный мною подход наиболее простым для реализации этой модели. Есть ли лучшая альтернатива?

2 ответа

Решение

Я решил эту конкретную ошибку. Оказалось, что я перезаписывал вывод из кодировщика (self.encoder_states) во время прямой передачи с выходом из кодировщика во время обратной передачи. Кодер обратной передачи принимает входной сигнал от декодера, который не был передан. Вместо этого я вызывал модель (self.encoder_inputs, self.encoder_states).

Когда вы используете функциональный API-интерфейс keras для определения модели, вам нужно соединить слои,

input_tensor = Input((784,))
x = Dense(16, activation="relu")(inputs) # inputs -> x
output_tensor = Dense(10, activation="softmax") # inputs -> x -> outputs

model = Model(inputs=input_tensor, outputs=output_tensor)

в вашем случае вы не подключили слои (узлы) на графике.

Линии 61:62

    self.encoder_inputs = Input(shape=(max_timestep, self.input_dims), name="encoder_inputs")
    self.encoder = LSTM(self.latent_dims, return_state=True, dropout=dropout, name="encoder")
Другие вопросы по тегам