Python Tensorflow:创建从稀疏值读取的服务输入函数
我正在使用tf.Transform的预处理数据在Tensorflow中创建一个估计器。对于服务时间,我希望能够直接从JSON文件中读取,如下所示: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
{"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找到解决方案了吗?我也有同样的问题,而且我的要求也没有用。