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