2

我有一个训练有素的 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是因为我的预测图需要一个 shape 的张量[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应该具有正确的形状。关于我在这里做错了什么有什么想法吗?提前致谢!

4

1 回答 1

3

看起来错误是由一些提供"RESHAPE_PREDICT:0"张量(即tf.reshape()op的输出image)而不是"PREDICT_PLACEHOLDER:0"张量(即tf.image.resize_images()op的输入input_features)的代码引起的。

如果没有训练模型的全部来源,很难准确地说出哪些更改是必要的,但它可能就像将定义更改为一样简单inputs

inputs = {'image': input_features}

...以便预测服务知道将值提供给该占位符,而不是tf.reshape().

于 2017-03-22T17:10:29.410 回答