Как создать функцию ввода для показа изображений на облачной платформе Google?

Исходя из этого документа по облаку Google и этого документа, а также ответа от stackru в этом сообщении от rhaertel80, я думаю, что рекомендуемый формат запроса json для отправки изображений в модель для прогнозирования в облаке Google:

{'instances': {'image_bytes': {'b64': base64.b64encode (jpeg_data)}}, {'image_bytes':...}}

Следующим шагом является создание serve_input_fn() ( описанного в облачных документах Google и в этом руководстве по GCP), которое может справиться с вложенным словарем, который отправит запрос.

Для этого мне нужно создать "features" и " receive_tensor " для передачи в функцию ServingInputReciever, которую должна возвращать serve_input_fn ().

Тем не менее, я не вижу, как требование приемника_тенатора быть словарем с ключами и тензорами в качестве значений может соответствовать вложенному формату запроса json. (Насколько я понимаю, receive_tensors являются заполнителями для запроса).

Если запрос не содержит вложенных словарей, подход кажется довольно простым, как показано в руководствах и этом ответе.

Вопрос

Итак, как можно отформатировать serve_input_fn () для получения запроса изображения в описанной форме и создания функций и receive_tensors, которые удовлетворяют требованиям функции ServingInputReceiver?

Частично сложность может заключаться в том, что я не понимаю, что будет нужно обрабатывать serve_input_fn (). Это будет весь запрос за один раз? Или каждый экземпляр будет передаваться по одному? Или есть какой-то другой способ понять, что будет обрабатывать функция

Подробнее

Для большего контекста я использую tf.Estimator и функцию train_and_evaluate для обучения модели и ее развертывания в облаке Google. Входные данные для модели - это tf.dataset, содержащий кортежи ({'спектрограмма': изображение}, метка), где изображение - тензор.

Моя попытка создать input_fn предполагает, что один элемент списка экземпляров передается за раз:

def serving_input_fn():
    feature_placeholders = {'image_bytes': {'b64': tf.placeholder(dtype=tf.string,
                                                                  shape=[None],
                                                                  name='source')}}
    input_images = convert_bytestrings_to_images(feature_placeholders['image_bytes']['b64'])
    features = {'spectrogram': image for image in input_images}
    return tf.estimator.export.ServingInputReceiver(features, feature_placeholders)

Что приводит к ошибке

ValueError: receiver_tensor image_bytes must be a Tensor.

И я не уверен, что функции будут в правильной форме либо.

1 ответ

B64 прозрачно обрабатывается ML Engine. Итак, хотя для входного JSON должен быть b64, ваша обслуживающая входная функция будет просто получать необработанные байты. Таким образом, ваш входной параметр fn должен быть:

def serving_input_fn():
    feature_placeholders = {'image_bytes': 
                            tf.placeholder(tf.string, shape=())}
    input_images = convert_bytestrings_to_images(feature_placeholders['image_bytes']))
    features = {'spectrogram': image for image in input_images}
    return tf.estimator.export.ServingInputReceiver(features, feature_placeholders)
Другие вопросы по тегам