Я использую 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)