Как мне экспортировать график в Tensorflow Serving, чтобы на входе было b64?

У меня есть график Keras с тензором формы float32 (?, 224, 224, 3), который я хочу экспортировать в Tensorflow Serving, чтобы делать прогнозы с помощью RESTful. Проблема в том, что я не могу вводить тензоры, а кодирую строки b64, поскольку это ограничение REST API. Это означает, что при экспорте графика на входе должна быть строка, которую нужно декодировать.

Как я могу «ввести» новый ввод для преобразования в старый тензор без переобучения самого графа? Я пробовал несколько примеров [1] [2] < / а>.

В настоящее время у меня есть следующий код для экспорта:

image = tf.placeholder(dtype=tf.string, shape=[None], name='source')


signature = predict_signature_def(inputs={'image_bytes': image},
                                 outputs={'output': model.output})

Мне как-то нужно найти способ преобразовать изображение в model.input или способ получить вывод модели для подключения к изображению.

Любая помощь будет принята с благодарностью!


person user3337758    schedule 07.08.2018    source источник


Ответы (1)


Вы можете использовать tf.decode_base64:

image = tf.placeholder(dtype=tf.string, shape=[None], name='source')
image_b64decoded = tf.decode_base64(image)
signature = predict_signature_def(inputs={'image_bytes': image_b64decoded},
                                 outputs={'output': model.output})

РЕДАКТИРОВАТЬ:

Если вам нужно использовать tf.image.decode_image, вы можете заставить его работать с несколько входов с использованием tf.map_fn:

image = tf.placeholder(dtype=tf.string, shape=[None], name='source')
image_b64decoded = tf.decode_base64(image)
image_decoded = tf.map_fn(tf.image.decode_image, image_b64decoded, dtype=tf.uint8)

Это будет работать, если, конечно, изображения будут иметь одинаковые размеры. Однако в результате получается тензор совершенно неизвестной формы, потому что tf.image.decode_image может выводить разное количество размеров в зависимости от типа изображения. Вы можете либо изменить его форму, либо использовать другой вызов tf.image.decode_*, чтобы, по крайней мере, у вас было известное количество измерений в тензоре.

person jdehesa    schedule 07.08.2018
comment
Я не уверен, какова ваша модель, поэтому я предположил, что декодированные данные base64 - это вход, который вам нужен. Если вам нужно декодирование изображения, вы также можете использовать tf.image.decode_image или аналогичный, или если вам нужно изменить форму, просто tf.reshape. - person jdehesa; 07.08.2018
comment
tf.image.decode_image - это то, что я ищу, но, к сожалению, он может работать только с формами ранга 0 ... - person user3337758; 07.08.2018
comment
Проблема в том, что мне нужен ввод в виде строки b64, но архитектура графа обучена иметь форму ввода тензора с плавающей запятой. Это означает, что входные данные также должны быть в форме строки ... - person user3337758; 07.08.2018
comment
@ user3337758 Мне очень жаль, но я не очень хорошо понимаю суть проблемы. В TensorFlow вы можете взять список строк Base64, декодировать их, декодировать байтовые массивы в изображения, при необходимости изменить их форму и при необходимости изменить тип данных изображения (например, с помощью _ 1_. Я не уверен, какой пропущенный шаг. - person jdehesa; 07.08.2018
comment
Пропущенный шаг будет связывать этот результат с исходным тензором float32 модели. Как бы я это сделал? - person user3337758; 05.10.2018
comment
@ user3337758 Итак, что вы имеете в виду, у вас уже есть график, и теперь вы хотите добавить к нему предварительную обработку? К сожалению, это непросто, было бы проще иметь дополнительные первые шаги с самого начала и вводить значения в какой-то момент посередине для обучения (вы можете вводить значения в любой точке графика, а не только для заполнителей). Если вы хотите отредактировать соединения на графике, вы можете использовать модуль редактора графиков, но это не очень просто. - person jdehesa; 05.10.2018
comment
Спасибо за разъяснения. Тогда я переучу модифицированный график. - person user3337758; 11.10.2018
comment
@ user3337758 Если подумать об этом дальше, я думаю, что вы также сможете добиться желаемого с помощью tf.import_graph_def. Это позволит вам экспортировать обученную модель как определение графа с помощью _2 _, и повторно импортировать его в другой граф, подключив входы к другим тензорам с параметром input_map. Хотя для этого исходный график необходимо заморозить, если вы хотите сохранить обученные веса. - person jdehesa; 12.10.2018