我正在使用来自 tf.Transform 的预处理数据在 Tensorflow 中创建一个估计器。对于服务时间,我希望能够直接从 JSON 文件中读取,如下所示:
{"uid":"123","item_ids":["23","f4","6g"],"top_k":5}
该top_k
值不是模型图的一部分,仅在估计器内部用于服务时间。我的问题是我不知道代表item_ids
稀疏张量的值。
我的服务功能如下:
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)
Placeholder_1:0
值的占位符在哪里item_ids
。
关于如何支持可变长度值的任何想法?