17be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle# TensorFlow Lite Optimizing Converter (TOCO) Python API reference
27be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
37be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle## High-level overview
47be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
57be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew SelleWhile the TensorFlow Lite Optimizing Converter can be used from the command
67be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selleline, it is often convenient to use it as part of Python model build and
77be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selletraining script. This is so that conversion can be part of your model
87be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selledevelopment pipeline. This allows you to know early and often that you are
97be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selledesigning a model that can be targeted to devices with mobile.
107be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
117be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle## API
127be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
137be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew SelleIn Python you can run `help(tf.contrib.lite)` to get documentation on functions.
147be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew SelleIn particular, `tf.contrib.lite.toco_convert` presents a simple API and
157be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle`tf.contrib.lite.toco_from_protos` allows more detailed control of TOCO using
167be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Sellethe protobuf interface to TOCO.
177be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
187be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle## Example
197be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
207be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew SelleIn particular, here we show creating a simple model and converting it to a
217be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew SelleTensorFlow Lite Model.
227be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
237be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle```python
247be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selleimport tensorflow as tf
257be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
267be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selleimg = tf.placeholder(name="img", dtype=tf.float32, shape=(1, 64, 64, 3))
277be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selleval = img + tf.constant([1., 2., 3.]) + tf.constant([1., 4., 4.])
287be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selleout = tf.identity(val, name="out")
297be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Sellewith tf.Session() as sess:
307be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle  tflite_model = tf.contrib.lite.toco_convert(sess.graph_def, [img], [out])
317be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle  open("test.tflite", "wb").write(tflite_modeL)
327be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle```
337be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
347be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle**NOTE** Currently, the TOCO command will cause a fatal error to the Python
357be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selleinterpreter when TOCO conversion fails. This will be remedied as soon as
367be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Sellepossible.
377be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
387be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle## Example 2: Export with variables
397be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
407be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew SelleIf a model has variables, they need to be turned into constants. This process is
417be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selleknown as freezing, and it can actually be accomplished with
427be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
437be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle```python
447be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selleimport tensorflow as tf
457be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
467be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selleimg = tf.placeholder(name="img", dtype=tf.float32, shape=(1, 64, 64, 3))
477be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Sellevar = tf.get_variable("weights", dtype=tf.float32, shape=(1,64,64,3))
487be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selleval = img + var
497be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
507be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selledef canonical_name(x):
517be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle  return x.name.split(":")[0]
527be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle
537be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selleout = tf.identity(val, name="out")
547be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Sellewith tf.Session() as sess:
557be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle  sess.run(tf.global_variables_initializer())
567be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle  out_tensors = [out]
577be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle  frozen_graphdef = tf.graph_util.convert_variables_to_constants(
587be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle      sess, sess.graph_def, map(canonical_name, out_tensors))
597be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle  tflite_model = tf.contrib.lite.toco_convert(
607be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle      frozen_graphdef, [img], out_tensors)
617be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle  open("converted_model.tflite", "wb").write(tflite_model)
627be5ab5ddbfd7d81ffd7e2022633908a14a52ff1Andrew Selle```
63