Прогнозирование GCP ML Engine: сбой при обработке ввода: ожидается, что float32 получил base64 - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь вызвать прогноз для специально обученной модели TensorFlow, развернутой на движке GCP ML. Когда я пытаюсь вызвать прогноз для модели, он возвращает следующее сообщение об ошибке «Ожидаемый float32 получил base64»

  1. Я использовал трансферное обучение и скрипт retrain.py TensorFlow для обучения моей модели на моих изображениях, следуя официальной документации

    $ python retrain.py --image_dir ~ / training_images Saved_model_dir / Saved_model_Directory

  2. Я тестировал прогноз локально, используя скрипт label_img.py от TensorFlow, прогноз работал локально для моих изображений

    $ python label_image.py --graph = / tmp / output_graph.pb --labels = / tmp / output_labels.txt --input_layer = Placeholder --output_layer = final_result \

  3. Я экспортировал свою модель для использования с Tensorflow Serving, как описано в документации к скрипту retrain.py.

    retrain.py --image_dir ~ / training_images --saved_model_dir / save_model_directory

  4. Я загрузил модель в Firebase, GCP проверил и принял мою модель, я смог запустить свою модель.

  5. При попытке вызвать онлайн-прогноз я получаю сообщение об ошибке «Ожидается float32».

    test.json = {"image_bytes": {"b64": "/9j/4AAQSkZJ.......=="castscasts

    gcloud ml-engine прогнозировать \ --model my_model \ - версия v1 \ --json-instances ./test.json

Нужно ли мне изменять retrain.py, чтобы моя сохраненная модель принимала base64, или есть другое решение проблемы?

Я уже проверил следующий ответ, но, к сожалению, он не решил мою проблему: Как передать закодированное в base64 изображение в прогноз Tensorflow?

1 Ответ

0 голосов
/ 18 января 2019

Проблема заключается в том, что retrain.py экспортирует модель, на вход которой ожидается уже декодированное и измененное изображение в виде плавающих элементов (см. Эту строку ), но вы передаете ей необработанные, не декодированные данные изображения .

Есть два решения.

  1. Создать JSON-запрос в ожидаемом формате (с плавающей запятой). Это легко исправить, но это может повлиять на производительность (отправка данных float32 в виде JSON может быть неэффективной).
  2. Измените модель, чтобы принимать необработанные данные изображения в качестве входных данных. Это требует некоторой переделки модели.

Для (1) вы должны отправить файл JSON, подобный следующему:

{"images": [[[0.0, 0.0, 0.0], [0,0,0], [...]], [...], ...]}

Конечно, вы, вероятно, построите это, используя некоторую клиентскую библиотеку

(2) немного сложнее. Этот образец может помочь вам сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...