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()]))
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")