theuses
theuses

Reputation: 294

Export tensorflow graph with export_saved_model

I'm trying to train and deploy simplified Quick, Draw! classifier from here on Google Cloud. I've managed to train model in GC, now stuck at deploying it, more precisely, at creating serving input functions.

I'm following instructions from here and having tough times trying to understand what type of input tensor should be.

Error:

TypeError: Failed to convert object of type to Tensor. Contents: SparseTensor(indices=Tensor("ParseExample/ParseExample:0", shape=(?, 2), dtype=int64), values=Tensor("ParseExample/ParseExample:1", shape=(?,), dtype=float32), dense_shape=Tensor("ParseExample/ParseExample:2", shape=(2,), dtype=int64)). Consider casting elements to a supported type.

Serving function:

def serving_input_receiver_fn():
  serialized_tf_example = tf.placeholder(dtype=tf.string, shape=[None], name='input_tensors')
  receiver_tensors = {'infer_inputs': serialized_tf_example}
  features = tf.parse_example(serialized_tf_example, feature_spec)
  return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)

Feature specification:

feature_spec = {
    "ink": tf.VarLenFeature(dtype=tf.float32),
    "shape": tf.FixedLenFeature([2], dtype=tf.int64)
}

Input layer:

def _get_input_tensors(features, labels):
  shapes = features["shape"]
  lengths = tf.squeeze(
    tf.slice(shapes, begin=[0, 0], size=[params.batch_size, 1]))
  inks = tf.reshape(features["ink"], [params.batch_size, -1, 3])

  if labels is not None:
    labels = tf.squeeze(labels)
  return inks, lengths, labels

Code of model and training data were taken here.

Upvotes: 0

Views: 531

Answers (1)

rhaertel80
rhaertel80

Reputation: 8379

Try this:

def serving_input_receiver_fn():
  ink = tf.placeholder(dtype=tf.float32, shape=[None, None, 3], name='ink')
  length = tf.placeholder(dtype=tf.int64, shape=[None, 1])
  features = {"ink": inks, "length": lengths}
  return tf.estimator.export.ServingInputReceiver(features, features)

An example payload would be:

{"instances": [{"ink": [[0.1, 1.0, 2.0]], "length":[[1]]}]}

or as input to gcloud predict --json-instances:

{"ink": [[0.1, 1.0, 2.0]], "length":[[1]]}]

I didn't look into the actual code; if ink is generally going to hold a lot of floats, you may want to consider an alternative encoding system.

Upvotes: 1

Related Questions