占位符张量需要ml-engine预测值而不是本地预测值

时间:2017-05-15 10:04:51

标签: google-cloud-ml-engine

我一直在开发一个用于云ML引擎在线预测服务的模型。我的模型包含一个placeholder_with_default张量,我用它来保持预测显着性的阈值。

threshold = tf.placeholder_with_default(0.01, shape=(), name="threshold")

我注意到在使用本地预测时:

gcloud ml-engine local predict --json-instances=data.json --model-dir=/my/model/dir

我不需要为此张量提供值。例如这是一个有效的输入:

{"features": ["a", "b"], "values": [10, 5]}

然而,当使用在线预测时:

gcloud ml-engine predict --model my_model --version v1 --json-instances data.json

如果我使用上面的JSON,我会收到错误:

{
    "error": "Prediction failed: Exception during model execution: AbortionError(code=StatusCode.INVALID_ARGUMENT, details=\"input size does not match signature\")"
}

但是,如果我包含阈值,那么我不会。例如:

{"features": ["a", "b"], "values": [10, 5], "threshold": 0.01}

有没有办法让“阈值”成为可选输入?

由于

马修

1 个答案:

答案 0 :(得分:0)

目前看起来在CloudML中是不可能的。如果您从JSON文件获得预测,则需要显式添加默认值(就像使用"threshold": 0.01一样)。

在Python中,我只是在执行API请求之前动态添加所需的属性:

def add_empty_fields(instance):
    placeholder_defaults = {"str_placeholder": "", "float_placeholder": -1.0}
    for ph, default_val in placeholder_defaults.items():
        if ph not in instance:
            instance[ph] = default_val

会改变将占位符名称映射到占位符值的instance dict。对于具有许多可选占位符的模型,这比为每个实例手动设置缺少的占位符值要好一些。