InvalidArgumentError в модели декодера во время вывода, для Seq2Seq на основе LSTM в Tensorflow 2.0

версии: Python 3.6.9, Tensorflow 2.0.0, CUDA 10.0, CUDNN 7.6.1, версия драйвера Nvidia 410.78.

Я пытаюсь перенести модель Seq2Seq tf.keras на основе LSTM на tensorflow 2.0

Прямо сейчас я сталкиваюсь со следующей ошибкой, когда пытаюсь вызвать predict в модели декодера (см. Ниже фактический код настройки вывода)

Это как если бы он ожидал одно слово в качестве аргумента, но мне нужно, чтобы он декодировал полное предложение (мои предложения представляют собой правую последовательность индексов слов длиной 24)

P.S .: Этот код работал точно так же на TF 1.15.

InvalidArgumentError:  [_Derived_]  Inputs to operation while/body/_1/Select_2 of type Select must have the same size and shape.
Input 0: [1,100] != input 1: [24,100]
     [[{{node while/body/_1/Select_2}}]]
     [[lstm_1_3/StatefulPartitionedCall]] [Op:__inference_keras_scratch_graph_45160]

Function call stack:
keras_scratch_graph -> keras_scratch_graph -> keras_scratch_graph

ПОЛНАЯ МОДЕЛЬ

введите здесь описание изображения

Модель вывода ENCODER

введите здесь описание изображения

Модель вывода DECODER

введите здесь описание изображения

Настройка вывода (строка, в которой действительно происходит ошибка)

Важная информация: последовательности дополняются справа до 24 элементов, а 100 - это количество измерений для каждого встраиваемого слова. Вот почему сообщение об ошибке (и распечатки) показывают, что входные формы (24,100).

обратите внимание, что этот код работает на ЦП. запуск его на графическом процессоре приводит к другой ошибке, подробно описанной здесь

# original_keyword is a sample text string

with tf.device("/device:CPU:0"):

    # this method turns the raw string into a right-padded sequence
    query_sequence = keyword_to_padded_sequence_single(original_keyword)

    # no problems here
    initial_state = encoder_model.predict(query_sequence)

    print(initial_state[0].shape) # prints (24, 100)
    print(initial_state[1].shape) # (24, 100)

    empty_target_sequence = np.zeros((1,1))

    empty_target_sequence[0,0] = word_dict_titles["sos"]

    # ERROR HAPPENS HERE:
    # InvalidArgumentError:  [_Derived_]  Inputs to operation while/body/_1/Select_2 of type Select 
    # must have the same size and shape.  Input 0: [1,100] != input 1: [24,100]
    decoder_outputs, h, c = decoder_model.predict([empty_target_sequence] + initial_state)

Что я пробовал

  • отключение активного режима (это только сделало обучение намного медленнее, а ошибка во время вывода осталась прежней)

  • изменение формы ввода перед передачей его функции прогнозирования

  • ручное вычисление (embedding_layer.compute_mask(inputs)) и установка масок при вызове слоев LSTM


person Felipe    schedule 17.11.2019    source источник
comment
Как вы строите свои слои? Вы установили return_sequences = True в своем слое LSTM?   -  person emirc    schedule 21.11.2019
comment
@emirc для кодировщика это False. Для декодера это True. Вот полный код: gist.github.com/queirozfcom/20d76e3113c649660df8dc1e59455680   -  person Felipe    schedule 21.11.2019
comment
Привет, можешь попробовать изменить форму decoder_inputs на decoder_inputs = tf.keras.layers.Input(shape=(None,),name="decoder_input"). Ошибка возникает из-за того, что empty_target_sequence имеет форму (1,1), в то время как ваш декодер ожидает ввода формы (?,24).   -  person Siddhant Tandon    schedule 26.11.2019


Ответы (1)


Судя по архитектуре вашей модели, initial_state представляет собой массив тензоров с формами: [(?, 100), (?, 100), (?, 100)]. В вашем случае неизвестный размер зафиксирован на 24.

Затем вы создаете тензор массива Numpy / TF формы (1, 1). Вы помещаете его в список и добавляете свой initial_state. Таким образом, вы получите список тензоров с фигурами: [(1, 1), (?, 100), (?, 100), (?, 100)].

Вы пытаетесь передать его в качестве входных данных в свою модель декодера, которая ожидает 3 входа (список входов) с формами [(?, 24), (?, 100), (?, 100)].

Исходя из этого, кажется, что-то не так ...

Однако TF жалуется на ввод операции while/body/_1/Select_2. input 1 должен происходить от любого вашего initial_state тензора (который, как мы знаем, имеет форму (24, 100)). input 2, похоже, исходит от вашего empty_target_sequence, имеющего форму (1, 1), которую можно транслировать на (1, 100). Кстати, странно, что он не транслируется на (24, 100), так как оба измерения имеют размер 1 ...

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

person AlexisBRENON    schedule 27.11.2019