'serve_default': вход классификации должен быть однорядным тензором - PullRequest
0 голосов
/ 08 февраля 2020

Я строю очень простой классификатор. Входные данные имеют следующие характеристики

job           object
marital       object
education     object
default        int64
housing        int64
loan           int64
contact       object
dayofmonth    object
month         object
duration       int64
campaign       int64
pdays          int64
previous       int64
poutcome      object
  1. Первая версия функции обслуживания
def serving_input_receiver_fn():
    feature_spec = {
        'job' : tf.placeholder(dtype = tf.string, shape = [None]),
        'marital' : tf.placeholder(dtype = tf.string, shape = [None]),
        'education' : tf.placeholder(dtype = tf.string, shape = [None]),
        'default' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'housing' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'loan' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'contact' : tf.placeholder(dtype = tf.string, shape = [None]),
        'dayofmonth' : tf.placeholder(dtype = tf.string, shape = [None]),
        'month' : tf.placeholder(dtype = tf.string, shape = [None]),
        'duration' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'campaign' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'pdays' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'previous' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'poutcome' : tf.placeholder(dtype = tf.string, shape = [None])
    }

    return tf.estimator.export.ServingInputReceiver(features = feature_spec, receiver_tensors = feature_spec)

Ошибка:

INFO:tensorflow:'serving_default' : Classification input must be a single string Tensor; got {'poutcome': <tf.Tensor 'Placeholder_13:0' shape=(?,) dtype=string>, 'campaign': <tf.Tensor 'Placeholder_10:0' shape=(?,) dtype=int64>, 'loan': <tf.Tensor 'Placeholder_5:0' shape=(?,) dtype=int64>, 'month': <tf.Tensor 'Placeholder_8:0' shape=(?,) dtype=string>, 'job': <tf.Tensor 'Placeholder:0' shape=(?,) dtype=string>, 'duration': <tf.Tensor 'Placeholder_9:0' shape=(?,) dtype=int64>, 'education': <tf.Tensor 'Placeholder_2:0' shape=(?,) dtype=string>, 'marital': <tf.Tensor 'Placeholder_1:0' shape=(?,) dtype=string>, 'dayofmonth': <tf.Tensor 'Placeholder_7:0' shape=(?,) dtype=string>, 'default': <tf.Tensor 'Placeholder_3:0' shape=(?,) dtype=int64>, 'pdays': <tf.Tensor 'Placeholder_11:0' shape=(?,) dtype=int64>, 'housing': <tf.Tensor 'Placeholder_4:0' shape=(?,) dtype=int64>, 'contact': <tf.Tensor 'Placeholder_6:0' shape=(?,) dtype=string>, 'previous': <tf.Tensor 'Placeholder_12:0' shape=(?,) dtype=int64>}

Затем я изменил функцию обслуживания следующим образом:

def serving_input_receiver_fn():
    feature_spec = {
        'job': tf.FixedLenFeature(shape=[None], dtype=tf.string),
        'marital': tf.FixedLenFeature(shape=[None], dtype=tf.string),
        'education': tf.FixedLenFeature(shape=[None], dtype=tf.string),
        'default': tf.FixedLenFeature(shape=[None], dtype=tf.int64),
        'housing': tf.FixedLenFeature(shape=[None], dtype=tf.int64),
        'loan': tf.FixedLenFeature(shape=[None], dtype=tf.int64),
        'contact': tf.FixedLenFeature(shape=[None], dtype=tf.string),
        'dayofmonth': tf.FixedLenFeature(shape=[None], dtype=tf.string),
        'month': tf.FixedLenFeature(shape=[None], dtype=tf.string),
        'duration': tf.FixedLenFeature(shape=[None], dtype=tf.int64),
        'campaign': tf.FixedLenFeature(shape=[None], dtype=tf.int64),
        'pdays': tf.FixedLenFeature(shape=[None], dtype=tf.int64),
        'previous': tf.FixedLenFeature(shape=[None], dtype=tf.int64),
        'poutcome': tf.FixedLenFeature(shape=[None], dtype=tf.string)
    }

    serialized_tf_example = tf.compat.v1.placeholder(tf.string, name='input_example_tensor')
    tf_example = tf.io.parse_example(serialized=serialized_tf_example, features=tf.feature_column.make_parse_example_spec(feature_spec))
    receiver_tensors = {'examples': serialized_tf_example}

    return tf.estimator.export.ServingInputReceiver(features = tf_example, receiver_tensors = receiver_tensors)

Ошибка становится такой:

File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/training.py", line 473, in train_and_evaluate
    return executor.run()
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/training.py", line 613, in run
    return self.run_local()
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/training.py", line 714, in run_local
    saving_listeners=saving_listeners)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 370, in train
    loss = self._train_model(input_fn, hooks, saving_listeners)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 1161, in _train_model
    return self._train_model_default(input_fn, hooks, saving_listeners)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 1195, in _train_model_default
    saving_listeners)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 1495, in _train_with_estimator_spec
    any_step_done = True
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_core/python/training/monitored_session.py", line 861, in __exit__
    self._close_internal(exception_type)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_core/python/training/monitored_session.py", line 894, in _close_internal
    h.end(self._coordinated_creator.tf_sess)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_core/python/training/basic_session_run_hooks.py", line 600, in end
    self._save(session, last_step)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_core/python/training/basic_session_run_hooks.py", line 619, in _save
    if l.after_save(session, step):
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/training.py", line 519, in after_save
    self._evaluate(global_step_value)  # updates self.eval_result
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/training.py", line 539, in _evaluate
    self._evaluator.evaluate_and_export())
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/training.py", line 932, in evaluate_and_export
    is_the_final_export)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/training.py", line 965, in _export_eval_result
    is_the_final_export=is_the_final_export))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/exporter.py", line 414, in export
    is_the_final_export)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/exporter.py", line 120, in export
    checkpoint_path=checkpoint_path)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 735, in export_saved_model
    strip_default_attrs=True)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 859, in _export_all_saved_models
    strip_default_attrs=strip_default_attrs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 925, in _add_meta_graph_for_mode
    input_receiver = input_receiver_fn()
  File "deploy_model/model.py", line 85, in serving_input_receiver_fn
    tf_example = tf.io.parse_example(serialized=serialized_tf_example, features=tf.feature_column.make_parse_example_spec(feature_spec))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_core/python/feature_column/feature_column.py", line 806, in make_parse_example_spec
    'Given: {}'.format(column))
ValueError: All feature_columns must be _FeatureColumn instances. Given: poutcome

Я снова изменил функцию обслуживания следующим образом:

def serving_input_receiver_fn():
    inputs = {
        'job' : tf.placeholder(dtype = tf.string, shape = [None]),
        'marital' : tf.placeholder(dtype = tf.string, shape = [None]),
        'education' : tf.placeholder(dtype = tf.string, shape = [None]),
        'default' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'housing' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'loan' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'contact' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'dayofmonth' : tf.placeholder(dtype = tf.string, shape = [None]),
        'month' : tf.placeholder(dtype = tf.string, shape = [None]),
        'duration' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'campaign' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'pdays' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'previous' : tf.placeholder(dtype = tf.int64, shape = [None]),
        'poutcome' : tf.placeholder(dtype = tf.string, shape = [None])
    }

    inputs = {}

    for feat in enumerate(inputs):
        inputs[feat.name] = tf.compat.v1.placeholder(shape=[None], dtype=feat.dtype)

    return tf.estimator.export.ServingInputReceiver(inputs, inputs)

Затем ошибка изменилась на:

Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/home/jupyter/marketing/deploy_model/task.py", line 43, in <module>
    model.train_and_evaluate(args)
  File "deploy_model/model.py", line 136, in train_and_evaluate
    tf.estimator.train_and_evaluate(estimator, train_spec, eval_spec)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/training.py", line 473, in train_and_evaluate
    return executor.run()
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/training.py", line 613, in run
    return self.run_local()
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/training.py", line 714, in run_local
    saving_listeners=saving_listeners)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 370, in train
    loss = self._train_model(input_fn, hooks, saving_listeners)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 1161, in _train_model
    return self._train_model_default(input_fn, hooks, saving_listeners)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 1195, in _train_model_default
    saving_listeners)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 1495, in _train_with_estimator_spec
    any_step_done = True
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_core/python/training/monitored_session.py", line 861, in __exit__
    self._close_internal(exception_type)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_core/python/training/monitored_session.py", line 894, in _close_internal
    h.end(self._coordinated_creator.tf_sess)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_core/python/training/basic_session_run_hooks.py", line 600, in end
    self._save(session, last_step)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_core/python/training/basic_session_run_hooks.py", line 619, in _save
    if l.after_save(session, step):
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/training.py", line 519, in after_save
    self._evaluate(global_step_value)  # updates self.eval_result
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/training.py", line 539, in _evaluate
    self._evaluator.evaluate_and_export())
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/training.py", line 932, in evaluate_and_export
    is_the_final_export)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/training.py", line 965, in _export_eval_result
    is_the_final_export=is_the_final_export))
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/exporter.py", line 414, in export
    is_the_final_export)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/exporter.py", line 120, in export
    checkpoint_path=checkpoint_path)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 735, in export_saved_model
    strip_default_attrs=True)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 859, in _export_all_saved_models
    strip_default_attrs=strip_default_attrs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 932, in _add_meta_graph_for_mode
    config=self.config)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 1149, in _call_model_fn
    model_fn_results = self._model_fn(features=features, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/contrib/estimator/python/estimator/extenders.py", line 89, in new_model_fn
    spec = estimator.model_fn(features, labels, mode, config)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 250, in public_model_fn
    return self._call_model_fn(features, labels, mode, config)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/estimator.py", line 1149, in _call_model_fn
    model_fn_results = self._model_fn(features=features, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/canned/dnn.py", line 811, in _model_fn
    batch_norm=batch_norm)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/canned/dnn.py", line 463, in _dnn_model_fn
    logits = logit_fn(features=features, mode=mode)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_estimator/python/estimator/canned/dnn.py", line 109, in dnn_logit_fn
    return dnn_model(features, mode)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_core/python/keras/engine/base_layer.py", line 854, in __call__
    outputs = call_fn(cast_inputs, *args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/tensorflow_core/python/autograph/impl/api.py", line 237, in wrapper
    raise e.ag_error_metadata.to_exception(e)
ValueError: in converted code:
    relative to /usr/local/lib/python2.7/dist-packages:

    tensorflow_estimator/python/estimator/canned/dnn.py:252 call  *
        net = self._input_layer(features)
    tensorflow_core/python/keras/engine/base_layer.py:854 __call__
        outputs = call_fn(cast_inputs, *args, **kwargs)
    tensorflow_core/python/feature_column/dense_features.py:133 call
        self._state_manager)
    tensorflow_core/python/feature_column/feature_column_v2.py:2835 get_dense_tensor
        return transformation_cache.get(self, state_manager)
    tensorflow_core/python/feature_column/feature_column_v2.py:2598 get
        transformed = column.transform_feature(self, state_manager)
    tensorflow_core/python/feature_column/feature_column_v2.py:2807 transform_feature
        input_tensor = transformation_cache.get(self.key, state_manager)
    tensorflow_core/python/feature_column/feature_column_v2.py:2590 get
        raise ValueError('Feature {} is not in features dictionary.'.format(key))

    ValueError: Feature campaign is not in features dictionary.

Наконец, я решил ее следующим образом:

def serving_input_receiver_fn():

    # set() change the iterable into a list of items, sorted
    feature_spec = [
        tf.feature_column.categorical_column_with_vocabulary_list('job', ['blue-collar', 'management', 'technician','admin.','services','retired', 'self-employed', \
                                                                          'entrepreneur','unemployed', 'housemaid', 'student', 'unknown']),
        tf.feature_column.categorical_column_with_vocabulary_list('marital', ['married', 'single', 'divorced']),
        tf.feature_column.categorical_column_with_vocabulary_list('education', ['secondary', 'primary', 'tertiary', 'unknown']),
        tf.feature_column.numeric_column("default"),
        tf.feature_column.numeric_column("housing"),
        tf.feature_column.numeric_column("loan"),
        tf.feature_column.categorical_column_with_vocabulary_list('contact', ['cellular', 'telephone', 'unknown']),
        tf.feature_column.categorical_column_with_vocabulary_list('dayofmonth', ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31']),
        tf.feature_column.categorical_column_with_vocabulary_list('month', ['jan', 'feb', 'mar','apr','may','jun','jul', 'aug', 'sep','oct','nov','dec']),
        tf.feature_column.numeric_column("duration"),
        tf.feature_column.numeric_column("campaign"),
        tf.feature_column.numeric_column("pdays"),
        tf.feature_column.numeric_column("previous"),
        tf.feature_column.categorical_column_with_vocabulary_list('poutcome', ['failure', 'success', 'other', 'unknown'])
    ]

    serialized_tf_example = tf.compat.v1.placeholder(dtype=tf.string, shape=[None], name='input_example_tensor')
    tf_example = tf.io.parse_example(serialized=serialized_tf_example, features=tf.feature_column.make_parse_example_spec(feature_spec))

    receiver_tensors = {'examples': serialized_tf_example}

    return tf.estimator.export.ServingInputReceiver(features = tf_example, receiver_tensors = receiver_tensors)

Однако я столкнулся с другой проблемой в прогнозировании. Я не могу предоставить формат данных, который может прочитать обслуживающая функция.

Это Signature_Def

The given SavedModel SignatureDef contains the following input(s):
  inputs['inputs'] tensor_info:
      dtype: DT_STRING
      shape: (-1)
      name: input_example_tensor:0
The given SavedModel SignatureDef contains the following output(s):
  outputs['classes'] tensor_info:
      dtype: DT_STRING
      shape: (-1, 2)
      name: dnn/head/Tile:0
  outputs['scores'] tensor_info:
      dtype: DT_FLOAT
      shape: (-1, 2)
      name: dnn/head/predictions/probabilities:0
Method name is: tensorflow/serving/classify

Это мой код предсказания

%%writefile ./test.json
{"inputs": {"job":"entrepreneur","marital":"married","education":"secondary","default":"1","housing":"1","loan":"1","contact":"unknown","dayofmonth":"5","month":"may","duration":"127","campaign":"1","pdays":"-1","previous":"0","poutcome":"unknown"}}

!gcloud ai-platform predict --model=campaign_deploy --json-instances=./test.json

Сообщение об ошибке это:

{
  "error": "Prediction failed: Error processing input: Failed to convert object of type <class 'list'> to Tensor. Contents: [{'campaign': '1', 'contact': 'unknown', 'dayofmonth': '5', 'default': '1', 'duration': '127', 'education': 'secondary', 'housing': '1', 'job': 'entrepreneur', 'loan': '1', 'marital': 'married', 'month': 'may', 'pdays': '-1', 'poutcome': 'unknown', 'previous': '0'}]. Consider casting elements to a supported type."
}

Может кто-нибудь сказать мне, где проблема? Это входной вход (тест. json) или функция подачи? Что вы предлагаете исправить?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2020

О, я только что обнаружил, что проблема на самом деле не решена. Я не прочитал информацию ясно. В конце все еще появляется следующая ошибка:

INFO:tensorflow:Signatures INCLUDED in export for Eval: None
INFO:tensorflow:Signatures INCLUDED in export for Classify: None
INFO:tensorflow:Signatures INCLUDED in export for Regress: None
INFO:tensorflow:Signatures INCLUDED in export for Predict: ['predict']
INFO:tensorflow:Signatures INCLUDED in export for Train: None
INFO:tensorflow:Signatures EXCLUDED from export because they cannot be be served via TensorFlow Serving APIs:
INFO:tensorflow:'serving_default' : Classification input must be a single string Tensor; got {'poutcome': <tf.Tensor 'Placeholder_13:0' shape=(?,) dtype=string>, 'campaign': <tf.Tensor 'Placeholder_10:0' shape=(?,) dtype=int64>, 'loan': <tf.Tensor 'Placeholder_5:0' shape=(?,) dtype=int64>, 'month': <tf.Tensor 'Placeholder_8:0' shape=(?,) dtype=string>, 'job': <tf.Tensor 'Placeholder:0' shape=(?,) dtype=string>, 'duration': <tf.Tensor 'Placeholder_9:0' shape=(?,) dtype=int64>, 'education': <tf.Tensor 'Placeholder_2:0' shape=(?,) dtype=string>, 'marital': <tf.Tensor 'Placeholder_1:0' shape=(?,) dtype=string>, 'dayofmonth': <tf.Tensor 'Placeholder_7:0' shape=(?,) dtype=string>, 'default': <tf.Tensor 'Placeholder_3:0' shape=(?,) dtype=int64>, 'pdays': <tf.Tensor 'Placeholder_11:0' shape=(?,) dtype=int64>, 'housing': <tf.Tensor 'Placeholder_4:0' shape=(?,) dtype=int64>, 'contact': <tf.Tensor 'Placeholder_6:0' shape=(?,) dtype=string>, 'previous': <tf.Tensor 'Placeholder_12:0' shape=(?,) dtype=int64>}
INFO:tensorflow:'regression' : Regression input must be a single string Tensor; got {'poutcome': <tf.Tensor 'Placeholder_13:0' shape=(?,) dtype=string>, 'campaign': <tf.Tensor 'Placeholder_10:0' shape=(?,) dtype=int64>, 'loan': <tf.Tensor 'Placeholder_5:0' shape=(?,) dtype=int64>, 'month': <tf.Tensor 'Placeholder_8:0' shape=(?,) dtype=string>, 'job': <tf.Tensor 'Placeholder:0' shape=(?,) dtype=string>, 'duration': <tf.Tensor 'Placeholder_9:0' shape=(?,) dtype=int64>, 'education': <tf.Tensor 'Placeholder_2:0' shape=(?,) dtype=string>, 'marital': <tf.Tensor 'Placeholder_1:0' shape=(?,) dtype=string>, 'dayofmonth': <tf.Tensor 'Placeholder_7:0' shape=(?,) dtype=string>, 'default': <tf.Tensor 'Placeholder_3:0' shape=(?,) dtype=int64>, 'pdays': <tf.Tensor 'Placeholder_11:0' shape=(?,) dtype=int64>, 'housing': <tf.Tensor 'Placeholder_4:0' shape=(?,) dtype=int64>, 'contact': <tf.Tensor 'Placeholder_6:0' shape=(?,) dtype=string>, 'previous': <tf.Tensor 'Placeholder_12:0' shape=(?,) dtype=int64>}
INFO:tensorflow:'classification' : Classification input must be a single string Tensor; got {'poutcome': <tf.Tensor 'Placeholder_13:0' shape=(?,) dtype=string>, 'campaign': <tf.Tensor 'Placeholder_10:0' shape=(?,) dtype=int64>, 'loan': <tf.Tensor 'Placeholder_5:0' shape=(?,) dtype=int64>, 'month': <tf.Tensor 'Placeholder_8:0' shape=(?,) dtype=string>, 'job': <tf.Tensor 'Placeholder:0' shape=(?,) dtype=string>, 'duration': <tf.Tensor 'Placeholder_9:0' shape=(?,) dtype=int64>, 'education': <tf.Tensor 'Placeholder_2:0' shape=(?,) dtype=string>, 'marital': <tf.Tensor 'Placeholder_1:0' shape=(?,) dtype=string>, 'dayofmonth': <tf.Tensor 'Placeholder_7:0' shape=(?,) dtype=string>, 'default': <tf.Tensor 'Placeholder_3:0' shape=(?,) dtype=int64>, 'pdays': <tf.Tensor 'Placeholder_11:0' shape=(?,) dtype=int64>, 'housing': <tf.Tensor 'Placeholder_4:0' shape=(?,) dtype=int64>, 'contact': <tf.Tensor 'Placeholder_6:0' shape=(?,) dtype=string>, 'previous': <tf.Tensor 'Placeholder_12:0' shape=(?,) dtype=int64>}
WARNING:tensorflow:Export includes no default signature!
INFO:tensorflow:Restoring parameters from deploy_trained/model.ckpt-2500
INFO:tensorflow:Assets added to graph.
INFO:tensorflow:No assets to write.
INFO:tensorflow:SavedModel written to: deploy_trained/export/exporter/temp-1581352036/saved_model.pb
INFO:tensorflow:Loss for final step: 15.162572.
CPU times: user 1.44 s, sys: 184 ms, total: 1.62 s
Wall time: 52.6 s

Однако я все еще могу передать ему файл json для прогнозирования.

%%writefile ./test.json
{"job":"entrepreneur","marital":"married","education":"secondary","default":1,"housing":1,"loan":1,"contact":"unknown","dayofmonth":"5","month":"may","duration":127,"campaign":1,"pdays":-1,"previous":0,"poutcome":"unknown"}

!gcloud ai-platform predict --model=campaign_deploy --json-instances=./test.json

ALL_CLASS_IDS  ALL_CLASSES   CLASS_IDS  CLASSES  LOGISTIC                 LOGITS                 PROBABILITIES
[0, 1]         [u'0', u'1']  [0]        [u'0']   [0.0004661614657379687]  [-7.6705121994018555]  [0.9995338916778564, 0.00046616149484179914]

Я ничего не вижу (т. Е. Пустой ) для определения подписи:

!saved_model_cli show --dir 'gs://first-project-09012020-1/campaign/deploy_trained/export/exporter/1581513239' --all

MetaGraphDef with tag-set: 'serve' contains the following SignatureDefs:

signature_def['predict']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['campaign'] tensor_info:
        dtype: DT_INT64
        shape: (-1)
        name: Placeholder_10:0
    inputs['contact'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Placeholder_6:0
    inputs['dayofmonth'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Placeholder_7:0
    inputs['default'] tensor_info:
        dtype: DT_INT64
        shape: (-1)
        name: Placeholder_3:0
    inputs['duration'] tensor_info:
        dtype: DT_INT64
        shape: (-1)
        name: Placeholder_9:0
    inputs['education'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Placeholder_2:0
    inputs['housing'] tensor_info:
        dtype: DT_INT64
        shape: (-1)
        name: Placeholder_4:0
    inputs['job'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Placeholder:0
    inputs['loan'] tensor_info:
        dtype: DT_INT64
        shape: (-1)
        name: Placeholder_5:0
    inputs['marital'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Placeholder_1:0
    inputs['month'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Placeholder_8:0
    inputs['pdays'] tensor_info:
        dtype: DT_INT64
        shape: (-1)
        name: Placeholder_11:0
    inputs['poutcome'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: Placeholder_13:0
    inputs['previous'] tensor_info:
        dtype: DT_INT64
        shape: (-1)
        name: Placeholder_12:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['all_class_ids'] tensor_info:
        dtype: DT_INT32
        shape: (-1, 2)
        name: dnn/head/predictions/Tile:0
    outputs['all_classes'] tensor_info:
        dtype: DT_STRING
        shape: (-1, 2)
        name: dnn/head/predictions/Tile_1:0
    outputs['class_ids'] tensor_info:
        dtype: DT_INT64
        shape: (-1, 1)
        name: dnn/head/predictions/ExpandDims:0
    outputs['classes'] tensor_info:
        dtype: DT_STRING
        shape: (-1, 1)
        name: dnn/head/predictions/str_classes:0
    outputs['logistic'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1)
        name: dnn/head/predictions/logistic:0
    outputs['logits'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1)
        name: dnn/logits/BiasAdd:0
    outputs['probabilities'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 2)
        name: dnn/head/predictions/probabilities:0
  Method name is: tensorflow/serving/predict 

Я не знаю, было ли мое развертывание успешным или нет. У кого-нибудь есть дальнейшие предложения для меня? Спасибо

0 голосов
/ 09 февраля 2020

Обслуживающая функция должна иметь заполнители (ваш второй подход), но выполняйте compat.v1 напрямую, если вы собираетесь работать в TF2:

def serving_input_receiver_fn():
    inputs = {
        'job' : tf.compat.v1.placeholder(dtype = tf.string, shape = [None]),
        'marital' : tf.compat.v1.placeholder(dtype = tf.string, shape = [None]),
      ...
    }
    return tf.estimator.export.ServingInputReceiver(inputs, inputs)

Ошибка ("кампания не в функциях словарь "), по-видимому, указывает на то, что ваша проблема заключается в эквиваленте этого кода при создании столбцов объектов, которые вводятся в ваш DNN. Убедитесь, что вы добавили код feature_spe c при создании модели, а не в функцию обслуживания:

feature_spec = [
        tf.feature_column.categorical_column_with_vocabulary_list('job', ['blue-collar', 'management', 'technician','admin.','services','retired', 'self-employed', \
                                                                          'entrepreneur','unemployed', 'housemaid', 'student', 'unknown']),
        tf.feature_column.categorical_column_with_vocabulary_list('marital', ['married', 'single', 'divorced']),
        tf.feature_column.categorical_column_with_vocabulary_list('education', ['secondary', 'primary', 'tertiary', 'unknown']),
        tf.feature_column.numeric_column("default"),
        tf.feature_column.numeric_column("housing"),
        tf.feature_column.numeric_column("loan"),
        tf.feature_column.categorical_column_with_vocabulary_list('contact', ['cellular', 'telephone', 'unknown']),
        tf.feature_column.categorical_column_with_vocabulary_list('dayofmonth', ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31']),
        tf.feature_column.categorical_column_with_vocabulary_list('month', ['jan', 'feb', 'mar','apr','may','jun','jul', 'aug', 'sep','oct','nov','dec']),
        tf.feature_column.numeric_column("duration"),
        tf.feature_column.numeric_column("campaign"),
        tf.feature_column.numeric_column("pdays"),
        tf.feature_column.numeric_column("previous"),
        tf.feature_column.categorical_column_with_vocabulary_list('poutcome', ['failure', 'success', 'other', 'unknown'])
    ]

..

model = tf.estimator.DNNRegressor(
    feature_columns = feature_spec,
    model_dir = OUTDIR,
    ...
)
...