Ниже представлена структура 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)