I try to build my custom experiment in Tensorflow, but I don't understand what is the use of the export_strategy argument ? And also, how do you build the serving_input_fn ?
Thank you!
I try to build my custom experiment in Tensorflow, but I don't understand what is the use of the export_strategy argument ? And also, how do you build the serving_input_fn ?
Thank you!
Answers inspired by the CloudML example
Question 1: What is the use of the export_strategy (source)?
See also the response of question two, but the export strategy is (as the name suggest) the possibility to make some changes to the graph when it is exported. In the example below the proper input functions which will be used when serving the model are added.
learn_runner.run(
generate_experiment_fn(
min_eval_frequency=args.min_eval_frequency,
eval_delay_secs=args.eval_delay_secs,
train_steps=args.train_steps,
eval_steps=args.eval_steps,
export_strategies=[saved_model_export_utils.make_export_strategy(
model.SERVING_FUNCTIONS[args.export_format],
exports_to_keep=1
)]
),
run_config=tf.contrib.learn.RunConfig(model_dir=args.job_dir),
hparams=hparam.HParams(**args.__dict__)
)
Question 2: How do you build the serving_input_fn (source) ?
What this actually does is when you save the model and prepare it for serving you will require some inputs to the graphs to be present, based upon the desired input (in this case json, csv, ...) it adds some inputs to the graphs, should these be missing it wouldn't be possible to feed the graph when going to serve it.
def csv_serving_input_fn():
"""Build the serving inputs."""
csv_row = tf.placeholder(
shape=[None],
dtype=tf.string
)
features = parse_csv(csv_row)
# Ignore label column
features.pop(LABEL_COLUMN)
return tf.estimator.export.ServingInputReceiver(
features, {'csv_row': csv_row})
def example_serving_input_fn():
"""Build the serving inputs."""
example_bytestring = tf.placeholder(
shape=[None],
dtype=tf.string,
)
features = tf.parse_example(
example_bytestring,
tf.feature_column.make_parse_example_spec(INPUT_COLUMNS)
)
return tf.estimator.export.ServingInputReceiver(
features, {'example_proto': example_bytestring})
def json_serving_input_fn():
"""Build the serving inputs."""
inputs = {}
for feat in INPUT_COLUMNS:
inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
return tf.estimator.export.ServingInputReceiver(inputs, inputs)
SERVING_FUNCTIONS = {
'JSON': json_serving_input_fn,
'EXAMPLE': example_serving_input_fn,
'CSV': csv_serving_input_fn
}
This question is also related to Example of tensorflow.contrib.learn.ExportStrategy