Вы, вероятно, обучаете свою модель фактическим файлам изображений, в то время как лучше всего отправлять изображения в виде закодированной строки байтов в модель, размещенную в CloudML. Поэтому, как вы упомянули, вам нужно будет указать функцию ServingInputReceiver
при экспорте модели. Примерный код для этого для модели Keras:
# Convert keras model to TF estimator
tf_files_path = './tf'
estimator =\
tf.keras.estimator.model_to_estimator(keras_model=model,
model_dir=tf_files_path)
# Your serving input function will accept a string
# And decode it into an image
def serving_input_receiver_fn():
def prepare_image(image_str_tensor):
image = tf.image.decode_png(image_str_tensor,
channels=3)
return image # apply additional processing if necessary
# Ensure model is batchable
# https://stackoverflow.com/questions/52303403/
input_ph = tf.placeholder(tf.string, shape=[None])
images_tensor = tf.map_fn(
prepare_image, input_ph, back_prop=False, dtype=tf.float32)
return tf.estimator.export.ServingInputReceiver(
{model.input_names[0]: images_tensor},
{'image_bytes': input_ph})
# Export the estimator - deploy it to CloudML afterwards
export_path = './export'
estimator.export_savedmodel(
export_path,
serving_input_receiver_fn=serving_input_receiver_fn)
Вы можете обратиться к этому очень полезному ответу r для более полной справки и других опций для экспорта вашей модели.
Редактировать: Если этот подход выдает ошибку ValueError: Couldn't find trained model at ./tf.
, вы можете попробовать это обходное решение, которое я задокументировал в этот ответ .