Вопрос или проблема
Я ежедневно использую TensorFlow/Keras для прогнозирования в проекте. Все работает хорошо, но я регулярно получал предупреждения о переходе на TensorFlow 2.0, и решил, что на этой неделе, наконец, удостоверюсь, что мой код работает и в новой версии библиотеки. Я не столкнулся с проблемами во время обучения или сохранения модели, но когда дело дошло до прогнозирования, я получил следующее предупреждение:
ПРЕДУПРЕЖДЕНИЕ:tensorflow:Ваши данные для ввода закончились; прерывание обучения.
Убедитесь, что ваш набор данных или генератор могут сгенерировать как минимум
steps_per_epoch * epochs
батчей (в этом случае, 10 батчей). Вам может
потребоваться использовать функцию repeat() при создании вашего набора данных.
Оказалось, что прогноз все равно выполняется, как ожидалось, но предупреждение значительно замедляет процесс. Я смог решить эту проблему, передав аргумент steps=1
в model.predict()
, но это кажется об обходным путем, который не был необходим в предыдущей версии TensorFlow.
Мне интересно, не упускаю ли я что-то тривиальное. Также, кажется, TensorFlow теперь не может понять, что я делаю прогнозирование, а не обучение, что также не было проблемой ранее. В связанном вопросе, вероятно, это было в документации ранее, но я никогда не задумывался о аргументе batch_size
в model.predict()
и его назначении.
Обновление:
Теперь, когда Google Colab изменил свою версию по умолчанию на TensorFlow 2, я решил попробовать снова. Теперь код по-прежнему полностью такой же, но возникает ошибка, когда я пытаюсь загрузить модель:
ПРЕДУПРЕЖДЕНИЕ:tensorflow:Ошибка при загрузке состояния сохраненного оптимизатора. В результате ваша модель начинает с вновь инициализированного оптимизатора.
На странице GitHub TensorFlow есть открытый вопрос по этой проблеме:
https://github.com/tensorflow/tensorflow/issues/37968
Я обновлю информацию снова, когда это будет решено.
У меня была такая же проблема в TF 2.1. Это связано с формой/типом ввода, а именно с запросом. В моем случае я решил проблему следующим образом: (Моя модель принимает 3 входа)
x = [[test_X[0][0]], [test_X[1][0]], [test_X[2][0]]]
MODEL.predict(x)
Вывод:
ПРЕДУПРЕЖДЕНИЕ:tensorflow:Ваши данные для ввода закончились; прерывание обучения.
Убедитесь, что ваш набор данных или генератор могут сгенерировать как минимум
steps_per_epoch * epochs
батчей (в этом случае, 7 батчей). Вам может
потребоваться использовать функцию repeat() при создании вашего набора данных.
array([[2.053718]], dtype=float32)
Решение:
x = [np.array([test_X[0][0]]), np.array([test_X[1][0]]), np.array([test_X[2][0]])]
MODEL.predict(x)
Вывод:
array([[2.053718]], dtype=float32)
Ответ или решение
Для решения проблемы, с которой вы столкнулись при использовании TensorFlow 2.0, стоит рассмотреть несколько аспектов, включая формат входных данных, управление предсказаниями и загрузку модели.
1. Причина предупреждения при предсказаниях
Предупреждение, которое вы наблюдаете — "Your input ran out of data; interrupting training" — указывает на то, что модель пытается использовать входные данные, которые не соответствуют ожидаемому числу шагов на эпоху. Это происходит, когда вы используете метод model.predict()
с массивом, который имеет неправильную форму или размер.
Для многовходной модели, если у вас несколько входов (как в вашем случае с тремя входами), убедитесь, что данные для предсказания имеют правильный формат. Например, приведенные вами решения, такие как:
x = [[test_X[0][0]], [test_X[1][0]], [test_X[2][0]]]
MODEL.predict(x)
может вызывать предупреждение, если x
не соответствует ожидаемым размерам.
Решение:
Попробуйте явно преобразовать ваши входные данные в массивы NumPy с формами, ожидаемыми моделью. Правильный вариант будет выглядеть следующим образом:
import numpy as np
x = [np.array([[test_X[0][0]]]), # Обратите внимание на двойные квадратные скобки
np.array([[test_X[1][0]]]),
np.array([[test_X[2][0]])]
output = MODEL.predict(x)
print(output)
Использование двух квадратных скобок позволяет создать массив с необходимыми размерностями, что устранит предупреждение и позволит избежать проблем с формой входных данных.
2. Ошибка при загрузке модели
Предупреждение "Error in loading the saved optimizer state" указывает на то, что TensorFlow не может загрузить состояние оптимизатора, когда вы пытаетесь загрузить предобученную модель. Это может быть связано с тем, что параметры модели были изменены с момента её сохранения.
Решение:
Если вы столкнулись с этой ошибкой, попробуйте следующее:
-
Убедитесь, что версия TensorFlow, в которой вы сохраняли модель, совпадает с версией, в которой вы пытаетесь её загрузить.
-
Если вы не нуждаетесь в восстановлении состояния оптимизатора (например, для дальнейшей тренировки), вы можете проигнорировать это предупреждение. Чтобы избежать этого, можете загрузить модель с параметром
compile=False
, что позволит игнорировать оптимизатор:
from tensorflow.keras.models import load_model
MODEL = load_model('path_to_your_model.h5', compile=False)
- Если вам необходимо восстановить оптимизатор, вам следует быть уверенным, что архитектура и параметры модели остались неизменными.
Заключение
Подводя итоги, важно правильно подготавливать входные данные для предсказаний, особенно если ваша модель принимает несколько входов. Кроме того, предупреждения при загрузке модели могут быть решены с помощью корректного подхода к сохранению и загрузке состояния модели и избегания изменения архитектуры или параметров между загрузками. Надеюсь, это поможет вам улучшить вашу работу с TensorFlow 2.0.