(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 в тензорном потоке?

Ответы на вопрос(1)

Ваш ответ на вопрос