使用Tensorflow模型在Google Cloud中进行预测失败

时间:2019-03-01 17:01:53

标签: tensorflow machine-learning google-cloud-ml

  • 我按照此[tensorflow教程]训练了图像分类器。(https://www.tensorflow.org/hub/tutorials/image_retraining

  • 在训练过程后,我使用此snippet生成了SavedModel

  • 我按照Google的指示部署了模型,并尝试使用本地目录中的图像做出一些预测。

  • 为了执行预测,我使用了以下方法:

# Create request message in json format
python -c 'import base64, json; img =
base64.b64encode(open("image.jpg").read()); print
json.dumps({"image_bytes": {"b64": img}})' image.jpg &>
request.json
# Call prediction service API to get classifications
gcloud ml-engine predict --model ${MODEL_NAME} --json-instances
request.json

然后出现以下错误:

"error": "Prediction failed: Error processing input: Expected float32, got {u'b64': u'/9j/4AA....lPqevnQf//Z'} of type 'dict' instead.

我应该使用其他类型来重新训练模型,还是应该解决这个问题?任何提示都将不胜感激。

2 个答案:

答案 0 :(得分:1)

您需要确保您的服务功能编写如下。请注意,输入名称为image_bytes,并且可以是任何以_bytes结尾的名称。

    def serving_input_fn():
       feature_placeholders = {
          'image_bytes': tf.placeholder(dtype=tf.string, shape=[None], name='source')}
          single_image = tf.decode_raw(feature_placeholders['image_bytes'], tf.float32)
          return tf.estimator.export.ServingInputReceiver(feature_placeholders, feature_placeholders)

要了解有关如何发送数据及其原理的更多详细信息,请结帐https://stackoverflow.com/a/49177909/6031363

此外,您可以访问AI Platform文档有关发送预测请求https://cloud.google.com/ml-engine/docs/prediction-overview

的说明

答案 1 :(得分:0)

我运行该教程,即您使用的Python代码:

python -c 'import base64, json; img = base64.b64encode(open("image.jpg").read()); print json.dumps({"image_bytes": {"b64": img}})' image.jpg &> request.json

生成具有以下内容的文件:

{"image_bytes": {"b64": "Base64Text..."}}

使用导出saved_model_dir选项训练模型。

$ python retrain.py --image_dir ~/flower_photos --
 saved_model_dir=/tmp/saved_models/$(date +%s)

使用SavedModel CLI显示SavedModel的签名。输入以下命令以显示TensorFlow SavedModel的输入/输出的签名:

$ saved_model_cli show --dir /tmp/saved_models/1575937119 --all
MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:
signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['image'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 299, 299, 3)
        name: Placeholder:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['prediction'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 5)
        name: final_result:0
  Method name is: tensorflow/serving/predict

这意味着模型期望使用张量输入,而不是b64 encoded image.

您可以启动TensorFlow服务以进行本地测试:

tensorflow_model_server --model_base_path=/tmp/saved_models/  --rest_api_port
=9001

URL=http://localhost:9001/v1/models/default:predict
curl -X POST -d @out.json $URL

如果out.json是JSON格式的文件,则将获得预期的结果。 借助TF Serving,您可以使用以下代码来生成文件:

import numpy as np
import json
from PIL import Image

INPUT_FILE = 'image.jpg'
OUTPUT_FILE = '/tmp/out.json'

def convert_to_json(image_file):
 """Open image, convert it to numpy and create JSON request"""
 img = Image.open(image_file).resize((224, 224))
 img_array = np.array(img)
 predict_request = {"instances": [img_array.tolist()]}
 with open(OUTPUT_FILE, 'w') as output_file:
   json.dump(predict_request, output_file)
 return predict_request

prediction_data = convert_to_json(INPUT_FILE)

您将获得:

{ 
 "predictions": [[0.0, 0.0, 1.0, 0.0, 0.0]] 
}

如果使用AI平台,则可以使用gcloud ai-platform predict或以用于测试的用户界面为例发送请求:

enter image description here

检查:How convert a jpeg image into json file in Google machine learning 有关详细信息。

如@Puneith所述,您需要更改Serving函数以处理b64

这个问题类似于GCP ML Engine Prediction failed: Error processing input: Expected float32 got base64