#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]))]
)