Я успешно обучил модель Keras и использовал ее для прогнозов на своей локальной машине, теперь я хочу развернуть ее с помощью Tensorflow Serving.Моя модель принимает изображения в качестве входных данных и возвращает прогноз маски.
Согласно документации здесь мои экземпляры должны быть отформатированы следующим образом:
{'image_bytes': {'b64': base64.b64encode(jpeg_data).decode()}}
ТеперьФайл saved_model.pb
, автоматически сохраненный моей моделью Keras, имеет следующие тензорные имена:
input_tensor = graph.get_tensor_by_name('input_image:0')
output_tensor = graph.get_tensor_by_name('conv2d_23/Sigmoid:0')
, поэтому мне нужно сохранить новый файл saved_model.pb
с другим signature_def
.
Я попробовал следующее (см. здесь для справки), которое работает:
with tf.Session(graph=tf.Graph()) as sess:
tf.saved_model.loader.load(sess, ['serve'], 'path/to/saved/model/')
graph = tf.get_default_graph()
input_tensor = graph.get_tensor_by_name('input_image:0')
output_tensor = graph.get_tensor_by_name('conv2d_23/Sigmoid:0')
tensor_info_input = tf.saved_model.utils.build_tensor_info(input_tensor)
tensor_info_output = tf.saved_model.utils.build_tensor_info(output_tensor)
prediction_signature = (
tf.saved_model.signature_def_utils.build_signature_def(
inputs={'image_bytes': tensor_info_input},
outputs={'output_bytes': tensor_info_output},
method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))
builder = tf.saved_model.builder.SavedModelBuilder('path/to/saved/new_model/')
builder.add_meta_graph_and_variables(
sess, [tf.saved_model.tag_constants.SERVING],
signature_def_map={'predict_images': prediction_signature, })
builder.save()
, но когда я развертываю модель и запрашиваю прогнозы на платформе AI, яполучаю следующую ошибку:
RuntimeError: Prediction failed: Error processing input: Expected float32, got {'b64': 'Prm4OD7JyEg+paQkPrGwMD7BwEA'} of type 'dict' instead.
повторная запись ответа здесь , я также пытался переписать
input_tensor = graph.get_tensor_by_name('input_image:0')
как
image_placeholder = tf.placeholder(tf.string, name='b64')
graph_input_def = graph.as_graph_def()
input_tensor, = tf.import_graph_def(
graph_input_def,
input_map={'b64:0': image_placeholder},
return_elements=['input_image:0'])
с(неправильное) понимание того, что это добавило бы слой поверх моего входного тензора с соответствующим именем 'b64'
(согласно документации), который принимает строку и соединяет ее с исходным входным тензором, но ошибка на платформе AI остается той же.
(соответствующий код, который я использую для запроса прогноза:
instances = [{'image_bytes': {'b64': base64.b64encode(image).decode()}}]
response = service.projects().predict(
name=name,
body={'instances': instances}
).execute()
, где image
- это numpy.ndarray
из dtype('float32')
)
Я чувствую, что яЯ достаточно близко, но я определенно что-то упускаю.Можете ли вы помочь?