Вопрос или проблема
Я довольно запутался в выводе model.predict
Когда после обучения я валидирую свою модель на примерно 6000 выборках, я использую следующий псевдокод:
model.fit(...)
predictions = model.predict(val_set)
len(predictions) # == len(val_set)
результат: тензорный массив с формой=(len(tensor_array),14) (одна предсказание для каждой входной выборки)
в производстве в настоящее время я использую следующий код для оптического распознавания чисел на изображениях:
model = tf.keras.models.load_model('number_ocr_v2')
def predict(list_images):
global model
print("длина:")
print(len(list_images))
#predictions = model.predict(list_images) # <- тот же результат
predictions = model.predict_on_batch(list_images)
print(len(predictions))
print(predictions)
Вывод в консоли:
длина:
30
{…загрузка текста tf…}
1
tf.Tensor([[0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]], shape=(1, 14), dtype=float32)
(одно предсказание для x входных выборок)
Очевидно, что модель выводит один массив с только предсказанием для первого входного тензора.
Где остальные 30 входных тензоров? Какова разница между моим кодом для обучения и моим производственным окружением, которая объясняет, почему код обучения выдает predictions[:] и производственный код только predictions[0]?
Тест на время показывает, что все 30 цифр обрабатываются. Время соответствует 30 предсказаниям за ~70 мс на изображение
С наилучшими пожеланиями,
Юлиан
В моем случае входной тензорный массив имел длину 30, но был неправильно сконструирован.
Убедитесь, что ваши входные данные правильные, иначе это может привести к неточным результатам
Ответ или решение
Как делать предсказания для нескольких входных образцов сразу в tf 2 с Keras
Предсказания на основе модели машинного обучения в TensorFlow 2 и Keras могут вызвать некоторые вопросы, особенно когда вы работаете с несколькими входными образцами и ожидаете получить предсказания для каждого из них. В данном ответе мы проанализируем вашу ситуацию и объясним, как корректно использовать model.predict
и model.predict_on_batch
для обработки множества входных образцов, а также обсудим возможные проблемы, которые могут возникнуть.
Ситуация
Вы обучили свою модель и использовали метод model.predict(val_set)
для получения предсказаний, что возвращает тензор с формой (len(tensor_array), 14)
— это означает, что для каждого образца (в данном случае 6000) модель генерирует предсказания. Однако, когда вы применяете аналогичный подход в продакшене, используя метод model.predict_on_batch(list_images)
, вы получаете только предсказание для первого образца.
Причины проблемы
-
Формат входных данных: Ваша проблема может быть связана с тем, как вы формируете массив входных данных. Если ваши входные данные не имеют правильной формы (например, требуется дополнительная размерность или неправильные размерности тензора), то модель, возможно, будет возвращать предсказания только для первого образца.
-
Использование
predict_on_batch
: Этот метод предназначен для того, чтобы делать предсказания на пакетах входных образцов. Если входной массив имеет неправильную форму, вы получите вывод только для первого образца, и это может быть причиной аномалии, наблюдаемой в ваших результатах.
Рекомендации по исправлению ошибки
-
Проверьте форму входов: Убедитесь, что каждый образец в
list_images
имеет правильную форму, соответствующую ожидаемым входным требованиям вашей модели. Например, если вы ожидаете вход с формой(batch_size, height, width, channels)
, проверьте, чтобы все ваши изображения соответствовали этому формату.Пример корректной подготовки:
import numpy as np # Пример правильной формы входных данных list_images = np.array(list_images) # Убедитесь, что это numpy array list_images = np.reshape(list_images, (-1, height, width, channels)) # Приведите к нужной форме
-
Сравните методы: Для диагностики проблемы вы можете сравнить выводы
model.predict
иmodel.predict_on_batch
для одинакового входа. Если они не совпадают, существует вероятность проблемы с исходными данными или предобработкой. -
Проверка на наличие ошибок: Убедитесь, что в процессе перед загрузкой и отладкой модели не возникли другие ошибки, такие как ошибки в предварительной обработке данных. При наличии неверных входных форматов ваша модель не сможет корректно выполнить предсказания.
Заключение
Обработка предсказаний для нескольких образцов в TensorFlow и Keras должна быть достаточно простой, если входные данные правильны. Путем проверки формата ваших входных тензоров и уверенности в том, что ваши данные соответствуют требованиям модели, вы сможете избежать неожиданных результатов и получить предсказания для всех образцов в вашем пакете. Используйте предложенные рекомендации, чтобы решить возникшие проблемы и оптимизировать процесс вызовов предсказаний в вашей системе.