(1) TF имеет только один тип - байты. В основном, если вы используете имя _bytes, ожидается, что данные будут {"b64": ...}, но внутренний тип TF всегда будет байтовым, даже для "строк". (2) Возможно, вы правы в этом. Если вы попробовали приведенные выше инструкции, но они не работают, дайте мне знать, и я смогу обновить пост.
ная документация Google(см. Двоичные данные в прогнозе ввода) состояния:
Закодированная строка должна быть отформатирована как объект JSON с одним ключом с именем b64. В следующем примере Python кодируется буфер необработанных данных JPEG с использованием библиотеки base64 для создания экземпляра:
{"image_bytes":{"b64": base64.b64encode(jpeg_data)}}
В вашем коде модели TensorFlow вы должны указать псевдонимы для входных и выходных тензоров, чтобы они заканчивались на _bytes.
Я хотел бы больше узнать о том, как этот процесс работает на облачной стороне Google.
Движок ml автоматически декодирует какой-либо контент после строки "b64" в байтовые данные?
Когда запрос имеет эту вложенную структуру, передается ли он только в разделе «b64» обслуживающей функции ввода и удаляется клавиша «image_bytes»?
Каждый запрос передается по отдельности в обслуживающую функцию ввода или они пакетируются?
Определим ли мы псевдонимы ввода-вывода в ServingInputReceiver, возвращаемые обслуживающей функцией ввода?
Я не нашел способа создать обслуживающую входную функцию, которая использует эту вложенную структуру для определения заполнителей объектов. Я использую только «b64» и не знаю, что делает gcloud ml-engine при получении запросов.
Дополнительно при локальном прогнозированииgcloud ml-engine local predict
отправка запроса с вложенной структурой завершается неудачно (неожиданный ключ image_bytes, поскольку он не определен в обслуживающей функции ввода). Но при прогнозировании с помощьюgcloud ml-engine predict
отправка запросов с вложенной структурой работает даже тогда, когда обслуживающая функция ввода не содержит ссылки на «image_bytes». Предсказание gcloud также работает, если пропустить «image_bytes» и передать только «b64».
Пример, обслуживающий функцию ввода
def serving_input_fn():
feature_placeholders = {'b64': tf.placeholder(dtype=tf.string,
shape=[None],
name='source')}
single_image = tf.decode_raw(feature_placeholders['b64'], tf.float32)
inputs = {'image': single_image}
return tf.estimator.export.ServingInputReceiver(inputs, feature_placeholders)
Я привел пример с использованием изображений, но я предполагаю, что то же самое должно применяться ко всем типам данных, передаваемых в байтах и в кодировке base64.
Есть много вопросов о стековом потоке, которые содержат ссылки на необходимость включать «_bytes» с фрагментами информации, но я бы счел полезным, если бы кто-то мог объяснить немного более подробно, что происходит, так как тогда я не был бы так поражен и пропустить при форматировании запросов.
Stackoverflow вопросы по этой теме
Как сделать правильный прогноз изображения JPEG в облаке-мл
Как преобразовать изображение JPEG в файл JSON в машинном обучении Google
Как сделать правильный прогноз изображения JPEG в облаке-мл
Изображения Base64 с Keras и Google Cloud ML
Как прочитать двоичную строку в кодировке utf-8 в тензорном потоке?