python-3.x - 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 正文请求,如果有人能指出这一点或就此事提供参考,那将非常有帮助。
解决方案
在该示例中,服务函数需要一个序列化的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}}]
推荐阅读
- r - 如何在 R 中的子组中查找重复项
- react-native - 无法使用“npx react-native run-android”运行 React Native 项目
- snowflake-cloud-data-platform - 用临时表覆盖旧表
- r - 在 R 中创建具有新名称的新列数
- mysql - Mysql比较两个表并匹配一些列的值并提取数据
- html - 关于 ' '。如何防止断字
- javascript - 如何计算 HTML 表格中的价格?
- gitahead - GitAhead - 无法弄清楚如何压缩提交
- ruby-on-rails - Capybara Docker Headless Chrome - 未知错误:DevToolsActivePort 文件不存在
- javascript - 使用带有反应和p5的构造函数,得到'无法读取未定义的属性'中风''