Tensorflow: изменение размера заполнителя изображения

У меня есть обученная модель TF, которая работает с сериализованным вводом (TFRecord). Данные изображения имеют переменную форму и преобразуются в форму 229x229x3 с помощью tf.image.resize_images(...). Я хочу использовать gcloud ml-engine predict платформу, аналогичную это, приняв любой размер изображение в качестве входных данных.

Я получаю свой тензор features (который передается графу прогнозирования) из следующей функции:

def jpeg_serving_input_fn():
  """
  Serve single jpeg feature to the prediction graph
  :return: Image as a tensor
  """
  input_features = tf.placeholder(dtype=tf.float32, shape=[None, None, 3], 
                                  name="PREDICT_PLACEHOLDER")
  features_normalized = tf.image.resize_images(input_features, [229, 229])

  image = tf.reshape(features_normalized, [1, 229, 229, 3], name="RESHAPE_PREDICT")

  inputs = {
    'image': image
  }

tf.reshape в конце потому, что мой прогнозный график ожидает тензор формы [batch_size, 229, 229, 3]. Когда я запускаю это через двигатель через

gcloud ml-engine local predict \
--model-dir=trained_model/export/ \
--json-instances=img.json

Я получаю PredictionError:

predict_lib_beta.PredictionError: (4, "Exception during running the graph: Cannot feed value of shape (1, 1600, 2400, 3) for Tensor u'RESHAPE_PREDICT:0', which has shape '(1, 229, 229, 3)'")

Мне кажется, что tf.reshape получает вывод tf.image.resize_images, который должен иметь правильную форму. Любые мысли о том, что я делаю неправильно здесь? Заранее спасибо!


person fenkerbb    schedule 21.03.2017    source источник
comment
Бит Tensorflow мне кажется правильным; functions_normalized должен содержать вывод тензора в форме (229, 229, 3). Не могли бы вы добавить некоторую отладку в свою функцию, чтобы убедиться, что она использует модель, которая, по вашему мнению, предназначена для прогнозирования? Я только начал использовать Google Cloud ML несколько недель назад, поэтому мне интересно узнать, в чем здесь проблема.   -  person SuperTetelman    schedule 22.03.2017
comment
Добавление tf.logging.debug(features_normalized.get_shape()) выводит то, что я ожидаю: 229x229x3. НО, он делает это при построении графика во время обучения перед сохранением модели. При восстановлении модели для предсказания форма не повторяется. Это явно имеет смысл, но странно, что когда я смотрю на график в tensorboard, RESHAPE_PREDICT нигде нет.   -  person fenkerbb    schedule 22.03.2017


Ответы (1)


Похоже, ошибка вызвана каким-то кодом, который передает тензор "RESHAPE_PREDICT:0" (т. е. вывод операции tf.reshape(), image), а не тензор "PREDICT_PLACEHOLDER:0" (т. е. ввод операции tf.image.resize_images(), input_features).

Без полного исходного кода вашей обученной модели трудно точно сказать, какие изменения необходимы, но это может быть так же просто, как изменить определение inputs на:

inputs = {'image': input_features}

... так что служба прогнозирования знает, что нужно передавать значения в этот заполнитель, а не в выходные данные фиксированной формы tf.reshape().

person mrry    schedule 22.03.2017
comment
Спасибо, это привело меня к решению, и да, проблема заключалась в том, как этот код использовался в другом месте моего кода. По сути, мой словарь inputs определяет формат входных файлов JSON для прогнозирования (поймите :-)). Значения словарей представляют собой тензоры, форма которых передается в tf.saved_model.signature_def_utils.build_signature_def(...). Есть ли хороший учебник или инструкции по этому модулю? Документы выглядят немного скудно. В любом случае большое спасибо @mrry - person fenkerbb; 22.03.2017
comment
Я думаю, что единственными документами для tf.saved_model являются следующие: github .com/tensorflow/tensorflow/blob/master/tensorflow/python/ (плюс любые комментарии к самому коду). Я считаю, что команда работает над учебником по использованию этого, но, возможно, стоит напомнить им, открыв Ошибка GitHub, чтобы запросить более качественную документацию. - person mrry; 23.03.2017