# TF Model Conversion to TF Lite (Part 2)

Learn to convert TF models obtained from concrete functions to the TF Lite format.

## Eager and graph execution

In TF2,`tf.function`

to run our function code inside a graph. The `tf.function`

converts regular code to callable TF graph functions to make a Python-independent dataflow graph `tf.Graph`

from our regular code. These graph data structures contain `tf.Operation`

and `tf.Tensor`

objects. We can save and run `tf.Graph`

data structures without the original Python code. This makes graphs machine-independent. TF uses graphs as a format for SavedModel.

## What is a concrete function?

Functions in TF are polymorphic, so they can work with inputs of different shapes and data types. Each time we call a TF function with new input shapes and types, it creates a new **concrete function** with its unique graph specific to the given input combination (also known as **input signature**). The specifications of the input type are known as the input signature.

In Python, a **wrapper function** (or a **function decorator**) extends a function’s behavior without modifying its original functionality. A concrete function is a wrapper function that allows us to execute graphs in the eager mode of TF. A `tf.Graph`

is specific to the inputs of a specific size and `dtype`

. When we use `tf.function`

to run our function with different input sizes and data types, it creates a new `tf.Graph`

specific to the new inputs.

## The `@tf.function`

The `tf.function`

stores `tf.Graph`

corresponding to the input signature in a concrete function that’s a wrapper around the `tf.Graph`

. The `@tf.function`

decorator applies the `tf.function`

transformation to a Python function. When we call a TF function with an already used input signature, it reuses the already generated concrete function.

Get hands-on with 1400+ tech skills courses.