首页 > 解决方案 > TF Keras 模型服务 REST API JSON 输入格式

问题描述

因此,我尝试遵循本指南并使用 docker tensorflow 服务映像部署模型。假设有 4 个特征:feat1、feat2、feat3 和 feat4。我试图用这个 JSON 正文点击预测端点 {url}/predict:

{
"instances": 
[
    {
        "feat1": 26,
        "feat2": 16, 
        "feat3": 20.2, 
        "feat4": 48.8
    }
]}

我得到 400 响应代码:

{
"error": "Failed to process element: 0 key: feat1 of 'instances' list. Error: Invalid argument: JSON object: does not have named input: feat"
}

这是传递给 model.save() 的签名:

signatures = {
      'serving_default':
          _get_serve_tf_examples_fn(model,
                                    tf_transform_output).get_concrete_function(
                                        tf.TensorSpec(
                                            shape=[None],
                                            dtype=tf.string,
                                            name='examples')),
  }

我从这个签名中了解到,在每个实例元素中,唯一被接受的字段是“示例”,但是当我尝试只使用空字符串传递这个字段时:

{
    "instances": 
    [
        {
            "examples": ""
        }
    ]
}

我也收到了不好的要求:{"error": "Name: <unknown>, Feature: feat1 (data type: int64) is required but could not be found.\n\t [[{{node ParseExample/ParseExampleV2}}]]"}

我在指南中找不到如何以正确的方式构建 JSON 正文请求,如果有人能指出这一点或就此事提供参考,那将非常有帮助。

标签: python-3.xtensorflowkerastensorflow2.0tensorflow-serving

解决方案


在该示例中,服务函数需要一个序列化的tf.train.Example原型作为输入。本页解释了如何将二进制数据作为字符串传递给已部署的模型(解释为什么签名需要字符串张量)。因此,您需要做的是构建一个包含您的功能的示例原型并将其发送过来。它可能看起来像这样:

import base64
import tensorflow was tf

features = {'feat1': 26,, 'feat2': 16, "feat3": 20.2, "feat4": 48.8}

# Create an Example proto from your feature dict.
feature_spec = {
  k: tf.train.Feature(float_list=tf.train.FloatList(value=[float(v)]))
  for k, v in features.items()
}
example = tf.train.Example(
  features=tf.train.Features(feature=feature_spec)).SerializeToString()

# Encode your serialized Example using base64 so it can be added into your
# JSON payload.
b64_example = base64.b64encode(example).decode()
result = [{'examples': {'b64': b64_example}}]

推荐阅读