Ошибка обслуживания TF: функция не может быть найдена - PullRequest
0 голосов
/ 04 августа 2020

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

Заранее спасибо!:

"error": "{" error ":" Name:, Функция: AA (тип данных: строка) требуется, но не может быть найден. \ N \ t [[{{node ParseExample / ParseExampleV2}}]] "}"

Ниже представлена ​​модель TensorFlow структура:

signature_def['serving_default']:
  The given SavedModel SignatureDef contains the following input(s):
    inputs['examples'] tensor_info:
        dtype: DT_STRING
        shape: (-1)
        name: serving_default_examples:0
  The given SavedModel SignatureDef contains the following output(s):
    outputs['outputs'] tensor_info:
        dtype: DT_FLOAT
        shape: (-1, 1)
        name: StatefulPartitionedCall_1:0
  Method name is: tensorflow/serving/predict

Запрос на прогноз:

data = {
  "signature_name":"serving_default",
  "instances":[
    {
       "examples":{"b64": "ChcKFQoLcmVxdWVzdF91cmwSBgoECgJVUw==",
                   "b64": "Ch8KHQoLcmVxdWVzdF91cmwSDgoMCgpNdWx0aXNpdGVz"}
    }
  ]
}

data = json.dumps(data)
json_response = requests.post(url, data=data, headers=headers)
print(json_response.content)

Ошибка: b '{\ n "error": "Имя:, Характеристика: AA (тип данных: строка) требуется, но не может быть найден. \ N \ t [[{{node ParseExample / ParseExampleV2}}]] "\ n} '

трейнер:

def get_model(show_summary=True):
    #one-hot categorical features
    num_AA = 3
    num_BB = 8
    
    input_AA = tf.keras.Input(shape=(num_AA,), name="AA_xf")
    input_BB = tf.keras.Input(shape=(num_BB,), name="BB_xf")
    
    inputs_con = tf.keras.layers.concatenate([
                   input_AA,
                   input_BB])

    dense_1 = tf.keras.layers.Dense(5, activation='relu') (inputs_con)
    output = tf.keras.layers.Dense(1, activation="sigmoid")(dense_1)

    _inputs = [
                   input_AA,
                   input_BB]
    
    model = tf.keras.models.Model(_inputs, output)
    model.compile(optimizer=tf.keras.optimizers.RMSprop(learning_rate=0.01),
              loss='binary_crossentropy', metrics=[
                                                   tf.keras.metrics.BinaryAccuracy(),
                                                   tf.keras.metrics.TruePositives(),
                                                   tf.keras.metrics.Accuracy()])
    
    if show_summary:
        model.summary()

    return model

# TFX Trainer will call this function.
def run_fn(fn_args):

    tf_transform_output = tft.TFTransformOutput(fn_args.transform_output)

    train_dataset = _input_fn(fn_args.train_files, tf_transform_output, 40)
    eval_dataset = _input_fn(fn_args.eval_files, tf_transform_output, 40)

    model = get_model()

    model.fit(
      train_dataset,
      steps_per_epoch=fn_args.train_steps,
      validation_data=eval_dataset,
      validation_steps=fn_args.eval_steps)
    
    def _get_serve_tf_examples_fn(model, tf_transform_output):

        model.tft_layer = tf_transform_output.transform_features_layer()

        @tf.function
        def serve_tf_examples_fn(serialized_tf_examples):
            """Returns the output to be used in the serving signature."""
            feature_spec = tf_transform_output.raw_feature_spec()
            feature_spec.pop(features.LABEL_KEY)
            parsed_features = tf.io.parse_example(serialized_tf_examples, feature_spec)

            transformed_features = model.tft_layer(parsed_features)
            transformed_features.pop(features.transformed_name(features.LABEL_KEY), None)

            outputs = model(transformed_features)
            return {'outputs': outputs}

        return serve_tf_examples_fn
    
      

    signatures = { "serving_default": _get_serve_tf_examples_fn(model, tf_transform_output).get_concrete_function(
                                        tf.TensorSpec(shape=[None], dtype=tf.string, name='examples'))}
                                    

    model.save(fn_args.serving_model_dir, save_format='tf', signatures=signatures)
...