3

我正在尝试导出一个tf.contrib.learn.DNNLinearCombinedClassifier用于 tensorflow 服务的实例。运行以下代码时:

estimator.export(
export_path,
signature_fn=tf.contrib.learn.utils.export.classification_signature_fn)

我收到以下警告:

警告:tensorflow:使用 use_deprecated_input_fn=True 调用导出(来自 tensorflow.contrib.learn.python.learn.estimators.estimator)已弃用,并将在 2016 年 9 月 23 日之后删除。更新说明: export 接受的 input_fn 的签名正在更改以与 tf.Learn Estimator 的训练/评估所使用的一致。input_fn 和 input_feature_key 将成为必需的参数,而 use_deprecated_input_fn 将默认为 False 并被完全删除。

问题是,我现在可以忽略这个警告吗?另一个问题,我将如何为客户端编写代码?如何正确准备 protobuf?

我看到对于 mnist 客户端,他们准备protobuf如下:

request = predict_pb2.PredictRequest()
request.model_spec.name = 'mnist'
image, label = test_data_set.next_batch(1)
request.inputs['images'].CopyFrom(
    tf.contrib.util.make_tensor_proto(image[0], shape=[1, image[0].size]))

我如何对contrib.learn估计器中使用的特征列做同样的事情?例如,如果特征列如下?

  country = sparse_column_with_vocabulary_file("country", VOCAB_FILE)
  age = real_valued_column("age")
  click_bucket = bucketized_column(real_valued_column("historical_click_ratio"),
                                   boundaries=[i/10. for i in range(10)])
  country_x_click = crossed_column([country, click_bucket], 10)
  feature_columns = set([age, click_bucket, country_x_click])

...并且input_fn来自诸如https://www.tensorflow.org/versions/r0.11/tutorials/wide/index.html的教程之一将提供从客户端发送的实际数据

更新:

我运行了一个导出/客户端组合,但结果看起来不对。部分导出代码如下:

def my_classification_signature_fn(examples, unused_features, predictions):
  """Creates classification signature from given examples and predictions.
  Args:
    examples: `Tensor`.
    unused_features: `dict` of `Tensor`s.
    predictions: `Tensor` or dict of tensors that contains the classes tensor
      as in {'classes': `Tensor`}.
  Returns:
    Tuple of default classification signature and empty named signatures.
  Raises:
    ValueError: If examples is `None`.
  """
  if examples is None:
    raise ValueError('examples cannot be None when using this signature fn.')

  if isinstance(predictions, dict):
    default_signature = exporter.classification_signature(
        examples, classes_tensor=predictions['classes'])
  else:
    print examples
    print predictions
    default_signature = exporter.classification_signature(
        examples, classes_tensor=predictions)
  named_graph_signatures={
        'inputs': exporter.generic_signature({'x_values': examples}),
        'outputs': exporter.generic_signature({'preds': predictions})}    
  return default_signature, named_graph_signatures

def export_input_fn(df,feature_defs,batch_size):
    input_features = input_fn(df, feature_defs)
    input_features["input_feature_dummy"] = tf.constant(np.array([["__SOME_VAL__" for __ in range(len(df.columns))] for _ in range(batch_size) ]),
                                      dtype=tf.string,
                                      shape=[batch_size, len(df.columns)])
    return input_features,None

model.export(
    "export_8",
    input_fn=lambda : export_input_fn(extdf,training_run_data["features"],20),
    input_feature_key="input_feature_dummy",
    signature_fn=my_classification_signature_fn,
    use_deprecated_input_fn=False)

部分客户端代码如下:

pred_df = pd.read_csv("{}/client_test.csv".format(work_dir)).sort_index(axis=1)
host, port = hostport.split(':')
channel = implementations.insecure_channel(host, int(port))
stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)
result_counter = _ResultCounter(num_tests, concurrency)


x_values = numpy.array([["__SOME_VAL__" for __ in range(len(pred_df.columns))] for _ in range(20)])
labels = pred_df["__label"].values
input_values = pred_df.astype('str').values
input_size = min(20, input_values.shape[0])
x_values[0:input_size] = input_values[0:input_size]

labels_test = numpy.zeros(20)
labels_test[0:input_size] = labels[0:input_size]

request = predict_pb2.PredictRequest()
request.model_spec.name = 'capture_process'

request.inputs['x_values'].CopyFrom(
    tf.contrib.util.make_tensor_proto(x_values, shape=x_values.shape))


result_counter.throttle()
result_future = stub.Predict.future(request, 5.0)  # 5 seconds

result_future.add_done_callback(
    _create_rpc_callback(labels_test, result_counter))

如您所见,我正在尝试将从 pandas 数据帧中提取的所有输入列作为一个名为x_values. 这是正确的还是我应该为每个特征列创建一个输入?

4

0 回答 0