pythontensorflowtensorflow2.0tensorflow-estimator

Making predictions with loaded Estimator in Tensorflow 2.0


I'm trying to follow this guide to load a SavedModel. I first save the trained model as follows

feature_columns
>>> [NumericColumn(key='Fwd_IAT_Total', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Flow_Duration', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Fwd_Packet_Length_Std', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Init_Win_bytes_forward', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Destination_Port', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Protocol', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Fwd_Packet_Length_Min', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Min_Packet_Length', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Fwd_Packets/s', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Fwd_IAT_Max', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Average_Packet_Size', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Fwd_Header_Length', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Fwd_Packet_Length_Max', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Fwd_Header_Length.1', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Flow_IAT_Min', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='min_seg_size_forward', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Fwd_IAT_Mean', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Max_Packet_Length', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='ACK_Flag_Count', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None),
 NumericColumn(key='Packet_Length_Std', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None)]
serving_input_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(
    tf.feature_column.make_parse_example_spec(feature_columns))
# Save the model
estimator_path = classifier.export_saved_model("/model1", serving_input_fn)

And later load the model

PATH_TO_MODEL_1 = "/model1"

# Load the DNN model
ddos_classifier_1 = tf.saved_model.load(PATH_TO_MODEL_1)

ddsos_classifier_1
>>> <tensorflow.python.training.tracking.tracking.AutoTrackable at 0x7f3f80be5d68>

It is not clear to me how to translate this really basic example to my use case.

imported = tf.saved_model.load(estimator_path)

def predict(x):
  example = tf.train.Example()
  example.features.feature["x"].float_list.value.extend([x])
  return imported.signatures["predict"](
    examples=tf.constant([example.SerializeToString()]))

Solution

  • This works for me

    imported = ddos_classifier_1.saved_model.load(estimator_path)
    
    def predict(df):
      """
      returns the predicted label given a dataframe of features
      """
      feature = {k: tf.train.Feature(float_list=tf.train.FloatList(value=[v])) for k, v in dict(df).items()}
      example = tf.train.Example(features=tf.train.Features(feature=feature))
      prediction = ddos_classifier_1.signatures["predict"](examples=tf.constant([example.SerializeToString()]))
      return prediction["classes"].numpy()[0][0].decode("utf-8")