Предоставление прогнозов изображений с помощью ключей экземпляров из SavedModel в GCP - PullRequest
0 голосов
/ 09 октября 2019

Я использую tf.keras.estimator.model_to_estimator для преобразования обученной модели tf.keras в оценщик, а затем экспортирую SavedModel с помощью export_savedmodel для обслуживания прогнозов в GCP.

Я более или менее последовалэтот пример: Как получить модель TensorFlow / Keras, которая использует изображения в качестве входных данных для обслуживания прогнозов в Cloud ML Engine?

Однако я не могу понять, как изменить фактическуюпрогнозная подпись с оценщиками. Я хотел бы сделать это так, чтобы я мог включить ключи экземпляра (в моем случае это будут имена файлов) в мои входные данные https://cloud.google.com/ml-engine/docs/prediction-overview#batch_prediction_input_data, и вернуть их в выходных данных прогноза.

Я понимаю, что могуукажите выходную сигнатуру, если я отклоняюсь от API Estimator, но я хочу сделать это только в случае необходимости. Есть ли способ использовать ключи экземпляра в моих входах / выходах при использовании model_to_estimator и export_savedmodel?

Примечание: я заметил, что приведенный здесь пример Как получить модель TensorFlow / Keras, которая принимает изображения в качестве входных данныхдля обслуживания прогнозов в Cloud ML Engine? создает заполнитель для ключей экземпляра, а затем переносит его в выражение tf.identity. Однако переменная key_output никогда не обрабатывается.

def export_saved_model(model, model_dir, x_shape):
    '''Exports tf.keras SavedModel for serving with base64-string inputs.

    Args:
        model: tf.keras trained model
        model_dir: Directory that will contain sub-dirs for SavedModel and Estimator constructed from model.
        x_shape: 3D input shape (height, width, num_channels).
    Returns:
        None
    '''
    height, width, num_channels = x_shape[0], x_shape[1], x_shape[2]

    def decode_and_resize(image_str_tensor):
        '''Decode b64 image string, resize and cast to tf.float32'''
        image_contents = tf.io.decode_base64(image_str_tensor)
        image = tf.image.decode_image(image_contents, channels=num_channels)
        image = tf.reshape(image, x_shape)
        image = tf.cast(image, dtype=tf.float32)
        return image

    def serving_input_fn():
        input_ph = tf.placeholder(dtype=tf.string, shape=[None])
        images_tensor = tf.map_fn(decode_and_resize, input_ph, back_prop=False, dtype=tf.float32)
        return tf.estimator.export.ServingInputReceiver({"input_2": images_tensor}, {"image_bytes": input_ph})

    estimator_dir = model_dir + "estimator_dir/"
    saved_model_dir = model_dir + "tf_saved_model/"
    estimator = tf.keras.estimator.model_to_estimator(
        keras_model=model,
        model_dir=estimator_dir
    )
    estimator.export_savedmodel(
        saved_model_dir,
        serving_input_receiver_fn=serving_input_fn
    )

    print("TF Saved Model saved successfully to: ", saved_model_dir)
...