Этот пост является частью 2 из серии о Google Cloud AutoML Vision Edge. В предыдущем посте мы увидели, как с нуля обучить готовую к работе модель TensorFlow Lite с помощью AutoML. Модели TFLite занимают меньше места для хранения, но также немного менее точны по сравнению с форматом TF SavedModel.

Этот пост поможет вам экспортировать и загрузить форматы TensorFlow SavedModel, предоставляемые AutoML, с помощью Python.

1. Что такое сохраненная модель TensorFlow?

SavedModel TensorFlow - это независимая программа, для работы которой не требуется исходная модель. Он имеет веса и вычисления, включенные в саму программу TensorFlow, и может быть развернут где угодно, включая, в нашем случае, граничные устройства.

1.1 Экспорт формата TF SavedModel

Это самый простой шаг в процессе. После того, как вы обучили модель, как делали в предыдущем посте. Вы можете выбрать Container карту на вкладке Test, как показано здесь:

После выбора контейнера вы должны создать папку в своей корзине и нажать кнопку Export.

1.2 Загрузка формата сохраненной модели TF

Загрузка сохраненных моделей AutoML TensorFlow не из легких с предоставленной документацией. В документации предлагается установить и запустить docker контейнер и сделать POST запрос к контейнеру, чтобы предсказать результаты на изображении.

Хотя Docker упрощает настройку, у него есть свои ограничения, такие как скорость, дополнительные зависимости, безопасность и т. Д. Подробнее об этих проблемах можно узнать здесь.

Загрузка модели с использованием кода Python дает нам большую гибкость по сравнению с моделью. Чтобы загрузить модель, нам просто нужно загрузить ее из корзины Google Cloud Storage в нашу локальную систему. Скачав его из корзины GCS, вы увидите saved_model.pb файл.

В популярном файле saved_model.pb хранится фактическая программа или модель TensorFlow и набор именованных сигнатур, каждая из которых идентифицирует функцию, которая принимает тензорные входные данные и производит тензорные выходные данные.

Работая над проектом на прошлой неделе, я обыскал весь Интернет, пытаясь понять, как просто (или не так просто, как оказалось) загрузить файл .pb с помощью Python для выполнения логического вывода. Все блоги, вся документация и долгий поиск в StackOverflow: /

Этот двадцатиминутный фрагмент моей истории поиска говорит об этом разочаровании:

Этот пост поможет вам с пошаговыми инструкциями по загрузке .pb файлов моделей машинного обучения в Python.

1.3 Почему сложно загружать?

Здесь все усложняется. После нескольких часов работы с одной и той же проблемой, вот мой вывод:

1. Документация TensorFlow полезна, если вы хотите обслуживать модель .pb с помощью TensorFlow Serving, который представляет собой способ получения прогнозов путем размещения моделей на сервере, работающем в вашей локальной системе. Но это бесполезно, если вы не хотите использовать дополнительные накладные расходы (например, обслуживание TensorFlow).

TensorFlow Serving проще настроить, но на самом деле он имеет дополнительную зависимость от сервера, которая нам может не понадобиться для получения результатов наших прогнозов.

2. Хотя документация TensorFlow усложняет задачу, модель или файл, который мы получаем путем экспорта из AutoML, не предоставляет никакой информации о входных и выходных узлах модели.

Информация об узлах ввода и вывода необходима, если мы хотим вывести или выполнить какое-либо предсказание из модели графа.

1.4 Как загрузить .pb файлы с помощью Python для прогнозирования?

Это должно быть относительно просто, если вы будете делать это шаг за шагом.

Шаг 1. Используйте Netron для получения узлов ввода и вывода

Netron - это сайт, на который вы можете загрузить любую модель TensorFlow, чтобы получить ее архитектуру. Как только мы получим архитектуру, будет легче получить входные и выходные узлы.

Получив файл .pb из AutoML, загрузите его в Netron, чтобы получить визуализацию модели.

После загрузки файла модели вы получите архитектуру, которая должна выглядеть примерно так:

Щелчок по любому узлу укажет тип ввода, который он будет принимать, вместе с именем узла ввода.

Например: с данными от Netron мы можем видеть, что тип входного изображения имеет форму [?,] Кроме того, имя входного узла normalized_input_image_tensor. Аналогичным образом могут быть получены детали выходного узла.

Шаг 2. Установка пакетов

Вы должны установить tensorflow и включить это в свой скрипт Python.

import tensorflow as tf

Шаг 3. Загрузка модели

От Netron мы получили следующие сведения о модели:

INPUT_NODE: normalized_input_image_tensor

OUTPUT_NODE: tile:0

IMAGE_SHAPE: [?,]

Форма [?,] указывает на один кортеж, который здесь представляет двоичный файл изображения внутри массива как один элемент.

export_path = '/Users/aayusharora/Desktop/Aftershoot/catvsdogs/'
with tf.Session(graph=tf.Graph()) as sess:
   tf.saved_model.loader.load(sess, ['serve'], export_path)
   y_pred = sess.run('OUTPUT_NODE', feed_dict={'INPUT_NODE':  [IMAGE_SHAPE] })

Следующий код содержит переменную export_path, которая представляет собой путь к папке, содержащей файл .pb. Session - это класс, который инкапсулирует среду, в которой выполняются объекты Operation TensorFlow Graph и оцениваются Tensor объекты.

Мы передаем график в конструктор tf.Session, а затем загружаем модель, используя метод .load и передавая наш export_path.

Чтобы предсказать результат и предоставить ввод, мы должны заменить OUTPUT_NODE, INPUT_NODE и IMAGE_SHAPE их значениями. Наконец, значение y_pred предоставит вам прогноз для изображения.

Примечание: имена theINPUT_NODE и OUTPUT_NODE нам неизвестны, когда мы загружаем формат AutoML Tensorflow SavedModel. Для вашей модели он тоже может быть разным. Пожалуйста, используйте Netron, как описано выше, чтобы получить правильные узлы ввода и вывода.

import tensorflow as tf
export_path = '/Users/aayusharora/Aftershoot/backend/loadmodel/models/'
with tf.Session(graph=tf.Graph()) as sess:
  tf.saved_model.loader.load(sess, ['serve'], export_path)
path = '/Users/aayusharora/Aftershoot/backend/sampleImage.jpg'
with open(path, "rb") as img_file:
  y_pred = sess.run('tile:0', feed_dict={'normalised_input_image_tensor': [img_file.read()] })
print(y_pred)

Следующий код предсказывает изображение из TensorFlow SavedModel с использованием Python.

Шаг 4. Отладка

В случае, если Netron не может предоставить вам выходные узлы, вы можете распечатать все имена выходных узлов с помощью функции, представленной ниже, а также можете попробовать их по одному, чтобы проверить и увидеть, получили ли вы желаемый результат.

with tf.Session(graph=tf.Graph()) as sess:
  tf.saved_model.loader.load(sess, ['serve'], export_path)
  graph = tf.get_default_graph()
  for op in graph.get_operations():
     print(op.name, op.values)

Заключение

Хотя в Интернете есть много ресурсов для решения вышеуказанной проблемы, ни один из них не кажется полным, и поиск решения может занять значительное время.

Эта серия статей будет посвящена устройствам AutoML для Edge, охватывая все возможные форматы моделей. В последнем посте мы рассмотрели формат TF Lite. В этом посте рассказывается о загрузке и экспорте TF SavedModel форматов, доступных в виде .pb файла с использованием Python.

В следующих публикациях этой серии мы будем использовать формат TF.js, предоставляемый AutoML Vision Edge, для запуска наших моделей в браузере и на сервере.

Если вам понравилась статья, пожалуйста, хлопайте в ладоши. Совет. Ваши 50 хлопков сделают мой день лучше!

Хотите узнать больше обо мне? Пожалуйста, загляните на мой сайт. Если вы хотите получать обновления, подписывайтесь на меня в Twitter и Medium. Если что-то неясно или вы хотите что-то указать, оставьте комментарий ниже.

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

Независимая редакция, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по обработке данных и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее и лучше строить лучшие модели машинного обучения.