首页 > 解决方案 > GCP ML 引擎预测失败:处理输入时出错:预期 float32 得到 base64

问题描述

我正在尝试对部署到 GCP ML 引擎的自定义训练 TensorFlow 模型进行预测。当我试图调用模型上的预测时,它返回以下错误消息“Expected float32 got base64”

  1. 按照官方文档,我使用迁移学习和 TensorFlow 的retrain.py脚本在我的图像上训练我的模型
python retrain.py --image_dir ~/training_images saved_model_dir /saved_model_directory
  1. 我已经使用 TensorFlow 的label_img.py脚本在本地测试了预测,预测在本地对我的图像有效
python label_image.py --graph=/tmp/output_graph.pb --labels=/tmp/output_labels.txt --input_layer=Placeholder --output_layer=final_result \
  1. 如 retrain.py 脚本的文档中所述,我已导出我的模型以与 Tensorflow Serving 一起使用。
python retrain.py --image_dir ~/training_images --saved_model_dir /saved_model_directory
  1. 我已将模型上传到 Firebase,GCP 验证并接受了我的模型,我能够触发我的模型。

  2. 尝试调用在线预测时,我收到“Expected float32”错误。

 test.json ={"image_bytes": {"b64": "/9j/4AAQSkZJ.......=="}}

 gcloud ml-engine predict \
        --model my_model \
        --version v1 \
        --json-instances ./test.json

我是否需要修改 retrain.py 以使我保存的模型接受 base64 或者是否有其他解决方案?

我已经检查了以下答案,但不幸的是它并没有解决我的问题: 如何将 base64 编码图像传递给 Tensorflow 预测?

标签: pythontensorflowmachine-learninggoogle-cloud-platformgoogle-cloud-ml

解决方案


问题是retrain.py导出一个模型,其输入期望以浮点数的形式解码和调整大小的图像(参见这一),但您传递的是原始的、未解码的图像数据。

有两种解决方案。

  1. 以预期格式(浮点数)创建 JSON 请求。这是一个简单的解决方法,但可能会影响性能(将 float32 数据作为 JSON 发送可能效率低下)。
  2. 更改模型以接受原始图像数据作为输入。这需要对模型进行一些修改。

对于 (1),您将发送一个类似于以下内容的 JSON 文件:

{"images": [[[0.0, 0.0, 0.0], [0,0,0], [...]], [...], ...]}

当然,您可能会使用一些客户端库来构建它

(2) 涉及更多一点。此示例可以指导您如何做到这一点。


推荐阅读