Как использовать tf.autograph.experimental.set_loop_options для задания инвариантов формы?

#tensorflow #while-loop #shapes

Вопрос:

Когда я запускаю следующий код в модели.режим подгонки, я получаю ошибку:

Ошибка значения: ‘context_vec’ имеет форму (Нет, 512) перед циклом, но форму (Нет, Нет) после одной итерации. Используйте tf.autograph.experimental.set_loop_options для задания инвариантов формы.

Код:

     mel_outputs, attn_scores, stop_outputs = [], [], []

    for t in range(0, steps, 2):
        prenet_in = m[:, :, t - 1] if t > 0 else go_frame
        mel_frames, scores, hidden_states, cell_states, context_vec, stop_tokens = self.decoder(encoder_seq, encoder_seq_proj, prenet_in,
        hidden_states, cell_states, context_vec, t, x)
        mel_outputs.append(mel_frames)
        attn_scores.append(scores)

        stop_outputs.extend([stop_tokens] * 2)
 

Но я не вижу никаких изменений формы во время тренировок в течение многих лет. И в eager_mode этот код работает нормально. Итак, как переписать код, чтобы получить правильный ответ?Мне действительно нужна ваша помощь! Жду вашего ответа.

Комментарии:

1. кто-нибудь знает, как это сделать?

Ответ №1:

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

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

В вашем случае, похоже, что тензор context_vec меняет формы. Поэтому, чтобы решить эту проблему, добавьте эти фрагменты кода в начале цикла или перед context_vec :

 tf.autograph.experimental.set_loop_options(
                shape_invariants=[(context_vec, tf.TensorShape([None]))]
            )