Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow:创建从稀疏值读取的服务输入函数_Python_Tensorflow_Tensorflow Transform - Fatal编程技术网

Python Tensorflow:创建从稀疏值读取的服务输入函数

Python Tensorflow:创建从稀疏值读取的服务输入函数,python,tensorflow,tensorflow-transform,Python,Tensorflow,Tensorflow Transform,我正在使用tf.Transform的预处理数据在Tensorflow中创建一个估计器。对于服务时间,我希望能够直接从JSON文件中读取,如下所示: {"uid":"123","item_ids":["23","f4","6g"],"top_k":5} top_k值不是模型图的一部分,仅在服务时间内用于估计器内部。我的问题是,我不知道如何表示值item\u

我正在使用tf.Transform的预处理数据在Tensorflow中创建一个估计器。对于服务时间,我希望能够直接从JSON文件中读取,如下所示:

{"uid":"123","item_ids":["23","f4","6g"],"top_k":5}
top_k
值不是模型图的一部分,仅在服务时间内用于估计器内部。我的问题是,我不知道如何表示值
item\u id
,它是一个稀疏张量

我的服务职能如下:

def serving_input_fn():
    inputs = {}
    for key, t in zip(metadata.SERVING_CATEGORICAL_COLUMNS, metadata.SERVING_CATEGORICAL_DEFAULTS):
        # here should read the list values as sparse placeholders but 
        # sparse_placeholder produces a SparseTensor which
        # produce the error ValueError: receiver_tensor item_ids must be a Tensor.
        # in ServingInputReceiver
        if isinstance(t, list):
            inputs.update({key:tf.placeholder(shape=[None], dtype=tf.string)}) 
        else:
            inputs.update({key:tf.placeholder(shape=[None], dtype=tf.string)})

    for key, t in zip(metadata.SERVING_NUMERICAL_COLUMNS, metadata.SERVING_NUMERICAL_DEFAULTS):
        if isinstance(t, list):
            inputs.update({key:tf.placeholder(shape=[None], dtype=tf.float32)})
        else:
            inputs.update({key:tf.placeholder(shape=[None], dtype=tf.float32)})

    features = {}
    for key, tensor in inputs.items():
        if isinstance(tensor, tf.SparseTensor):
            features[key] = tensor
        else:
            features[key] = tf.expand_dims(tensor, -1)

    # here because the top_k value was not part of the preprocessing using
    # tf.Transform I pass only the values that need preprocessing
    raw_features_to_transform = {k: features[k] for k in metadata.INPUT_FEATURE_NAMES}
    transformed_features = tf_transform_output.transform_raw_features(
        raw_features_to_transform)
    transformed_features = {k: transformed_features[k] for k in metadata.SERVING_COLUMNS if k in transformed_features}
    features.update(transformed_features)

    return tf.estimator.export.ServingInputReceiver(
        features=features,
        receiver_tensors=inputs
    )
当我使用
gcloud ml engine local predict
运行上面生成的图形时,我得到以下错误

prediction.prediction_lib.PredictionError: Failed to run the provided model: 
Exception during running the graph: Cannot feed value of shape (1, 3) 
for Tensor u'Placeholder_1:0', which has shape '(?,)' (Error code: 2)
其中,
占位符_1:0
项目ID
值的占位符


有关于如何支持可变长度值的想法吗?

占位符的定义方式可能存在问题。 请看一看这个例子:

我们的示例使用一个解析服务输入函数,该函数使用一个特性规范。 它从原始元数据获取功能规范,但在您的情况下,由于您没有解析输入数据,因此可以执行类似的操作并调用:

RAW_DATA_METADATA.schema.as_batched_placeholders()

它为您定义占位符。

调用
tf.placeholder(shape=[None],…)
创建一个占位符,其形状为未知长度的向量。您可能需要指定
tf.placeholder(shape=None,…)
来指定一个完全未知的形状(可能是一个矩阵,这是您在服务时传递的)创建占位符时。

我可以获得这样的占位符,这一点非常方便,但遗憾的是,这并不能解决我的问题,因为对于项目ID输入,它会生成一个SparseTensor(这是将此输入传递到tf.Transform图中所需要的)但是tf.estimator.export.ServingInputReceiver引发以下错误:ValueError:接收器张量项ID必须是张量。是的,看起来ServingInputReceiver不支持tf 1.9之前的SparseTensor接收器张量。您能将TF升级到1.9并重试吗?(尽管官方不支持此配置,但使用tf.Transform 0.8和tf 1.9)。@Zohar找到解决方案了吗?我也有同样的问题,而且我的要求也没有用。