0

我有一个使用自定义估计器的 sagemaker tensorflow 模型,类似于 abalone.py sagemaker tensorflow 示例,在 serving_input_fn 中使用 build_raw_serving_input_receiver_fn:

def serving_input_fn(params):
    tensor = tf.placeholder(tf.float32, shape=[1, NUM_FEATURES])
    return build_raw_serving_input_receiver_fn({INPUT_TENSOR_NAME: tensor})()

使用 json 从 java-script 请求预测:

  response = @client.invoke_endpoint(
    endpoint_name: @name,
    content_type: "application/json",
    accept: "application/json",
    body: values.to_json
    )

到目前为止一切都很好。现在我想添加一些特征工程(使用从训练数据派生的缩放器对特征进行缩放转换)。按照使用 tensorflow tf-transform 进行数据规范化的答案的模式,我现在得到了 serving_input_fn,如下所示:

def serving_input_fn(params):
    feature_placeholders = {
        'f1': tf.placeholder(tf.float32, [None]),
        'f2': tf.placeholder(tf.float32, [None]),
        'f3': tf.placeholder(tf.float32, [None]),
    }
    features = {
        key: tf.expand_dims(tensor, -1)
        for key, tensor in feature_placeholders.items()
    }
    return tf.estimator.export.ServingInputReceiver(add_engineering(features), feature_placeholders)

从 saved_model_cli 显示 --dir 。--所有我可以看到输入签名已经改变:

signature_def['serving_default']:
The given SavedModel SignatureDef contains the following input(s):
inputs['f1'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1)
    name: Placeholder_1:0
inputs['f2'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1)
    name: Placeholder_2:0
inputs['f3'] tensor_info:
    dtype: DT_FLOAT
    shape: (-1)
    name: Placeholder:0

我如何为这个新模型的预测准备特征?在python中,我一直没有成功地尝试过类似的事情

requests = [{'f1':[0.1], 'f2':[0.1], 'f3':[0.2]}]
predictor.predict(requests)

还需要从 java-script 发送预测请求。

4

2 回答 2

0

您可以定义一个

def input_fn(data=None, content_type=None):

这将在调用 SageMaker 时直接调用。您可以在此功能中进行功能准备。model_fn 将在此函数之后调用。确保返回字符串和 TensorProto 的字典。dict{"input tensor name", TensorProto} 来自 input_fn 方法。

您可以在哪里找到更多详细信息

https://docs.aws.amazon.com/sagemaker/latest/dg/tf-training-inference-code-template.html

示例 input_fn 如下所示

def input_fn(data=None, content_type=None):
    """
    Args:
        data: An Amazon SageMaker InvokeEndpoint request body
        content_type: An Amazon SageMaker InvokeEndpoint ContentType value for data.
    Returns:
        object: A deserialized object that will be used by TensorFlow serving as input.
    """

    # `inputs` is based on the parameters defined in the model spec's signature_def
    return {"inputs": tf.make_tensor_proto(data, shape=(1,))}
于 2018-03-26T16:53:40.250 回答
0

正如 Raman 所建议的,已设法通过 sagemaker input_fn 定义将特征值用于预测。这意味着回到我开始的 build_raw_serving_input_receiver_fn serving_input_fn(帖子顶部)。input_fn 如下所示:

def input_fn(data=None, content_type=None):
    if content_type == 'application/json':
        values = np.asarray(json.loads(data))
        return {"inputs": tf.make_tensor_proto(values=values, shape=values.shape, dtype=tf.float32)}
    else:
        return {"inputs": data}

虽然我不能将训练中的缩放器传递到这个过程中,但它可能会嵌入到 sagemaker 需要的 model.py 文件中(其中包含这个 input_fn defn)。我所拥有的是通过python解决的正确响应

data = [[0.1, 0.2, 0.3]]
payload = json.dumps(data)

response = client.invoke_endpoint(
    EndpointName=endpoint_name,
    Body=payload,
    ContentType='application/json'
)
result = json.loads(response['Body'].read().decode())

或者

values = np.asarray([[0.1, 0.2, 0.3]])
prediction = predictor.predict(values)

这对我来说是全新的......如果您知道任何问题,请建议改进​​/提醒我潜在的问题。

于 2018-03-27T19:35:19.460 回答