Создание обслуживающего графа отдельно от обучения тензорным потокам для развертывания Google CloudML? - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь развернуть модель классификации изображений tf.keras в Google CloudML Engine. Нужно ли включать код для создания графика обслуживания отдельно от обучения, чтобы он служил моим моделям в веб-приложении? У меня уже есть модель в формате SavedModel (saved_model.pb и переменные файлы), поэтому я не уверен, что мне нужно сделать этот дополнительный шаг, чтобы заставить ее работать.

например. это код непосредственно из моделей развертывания GCP Tensorflow документация

def json_serving_input_fn():
  """Build the serving inputs."""
  inputs = {}
  for feat in INPUT_COLUMNS:
    inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)

  return tf.estimator.export.ServingInputReceiver(inputs, inputs)

1 Ответ

0 голосов
/ 14 января 2019

Вы, вероятно, обучаете свою модель фактическим файлам изображений, в то время как лучше всего отправлять изображения в виде закодированной строки байтов в модель, размещенную в 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., вы можете попробовать это обходное решение, которое я задокументировал в этот ответ .

...