Add starter pages for a comprehensive documentation for autograph.
PiperOrigin-RevId: 252683786
This commit is contained in:
parent
7ec53e849d
commit
12560a7706
10
tensorflow/python/autograph/g3doc/reference/index.md
Normal file
10
tensorflow/python/autograph/g3doc/reference/index.md
Normal file
@ -0,0 +1,10 @@
|
||||
# AutoGraph reference
|
||||
|
||||
This reference document describes the semantics of AutoGraph transformations.
|
||||
|
||||
* [Introduction](intro.md)
|
||||
* Control Flow (coming soon)
|
||||
* Collections (coming soon)
|
||||
* Exceptions (coming soon)
|
||||
* Builtin Functions (coming soon)
|
||||
* Datasets (coming soon)
|
161
tensorflow/python/autograph/g3doc/reference/intro.md
Normal file
161
tensorflow/python/autograph/g3doc/reference/intro.md
Normal file
@ -0,0 +1,161 @@
|
||||
# AutoGraph reference
|
||||
|
||||
[Index](index.md)
|
||||
|
||||
## Introduction
|
||||
|
||||
This document describes the semantics of AutoGraph's code transformations.
|
||||
|
||||
For more information on AutoGraph, see the following articles:
|
||||
|
||||
* [AutoGraph tutorial](https://www.tensorflow.org/alpha/guide/autograph)
|
||||
* [Eager tutorial](https://www.tensorflow.org/alpha/guide/eager)
|
||||
* [TensorFlow 2.0 Alpha](https://www.tensorflow.org/alpha)
|
||||
* [AutoGraph blog post](https://medium.com/tensorflow/autograph-converts-python-into-tensorflow-graphs-b2a871f87ec7)
|
||||
|
||||
### Terminology
|
||||
|
||||
Typically, AutoGraph operates by converting a function into a new function with
|
||||
new semantics.
|
||||
|
||||
```
|
||||
def f(...):
|
||||
...
|
||||
|
||||
converted_f = tf.autograph.to_graph(f)
|
||||
```
|
||||
|
||||
In TensorFlow 2, AutoGraph is used to convert functions before they are being
|
||||
traced, when using the `tf.function` API. For example, the following code:
|
||||
|
||||
```
|
||||
def f(...):
|
||||
...
|
||||
|
||||
graph_f = tf.function(f)
|
||||
```
|
||||
|
||||
is roughly equivalent to:
|
||||
|
||||
```
|
||||
converted_f = tf.autograph.to_graph(f)
|
||||
graph_f = tf.function(autograph=False)(converted_f)
|
||||
```
|
||||
|
||||
For the remainder of this document:
|
||||
|
||||
* **converted functions** are functions converted by AutoGraph
|
||||
* **graph functions** are functions compiled with `tf.function`
|
||||
|
||||
Graph functions are usually also converted, unless specified otherwise.
|
||||
|
||||
### Python semantics
|
||||
|
||||
In general, AutoGraph does not change the semantics of error-free Python.
|
||||
In special circumstances, AutoGraph may also preserve the semantics of code that
|
||||
raises error as well. Semantics are preserved in the sense of the
|
||||
[as-if rule](https://en.wikipedia.org/wiki/As-if_rule).
|
||||
|
||||
More specifically, code that would not be legal TensorFlow Graph code may become
|
||||
legal when converted.
|
||||
|
||||
For example, consider the following function and the corresponding converted
|
||||
function:
|
||||
|
||||
```
|
||||
def f(x):
|
||||
if x > 0:
|
||||
return x
|
||||
return -x
|
||||
|
||||
converted_f = tf.autograph.to_graph(f)
|
||||
```
|
||||
|
||||
If `f` executes without error, then the `converted_f` has identical results:
|
||||
|
||||
```
|
||||
>>> f(3) # Runs without error
|
||||
3
|
||||
>>> converted_f(3) # Identical result
|
||||
3
|
||||
```
|
||||
|
||||
### TensorFlow Eager semantics
|
||||
|
||||
If a function is called with `Tensor` arguments in Eager execution mode, it has
|
||||
certain semantics that are different the Graph execution semantics.
|
||||
|
||||
For example, the function below produces different results when executed in
|
||||
Eager and Graph modes:
|
||||
|
||||
```
|
||||
def f(x):
|
||||
if x > 0:
|
||||
return x
|
||||
return -x
|
||||
|
||||
# Use tf.function to run code as a TensorFlow Graph.
|
||||
unconverted_graph_f = tf.function(f, autograph=False)
|
||||
graph_f = tf.function(f, autograph=True)
|
||||
```
|
||||
|
||||
```
|
||||
>>> f(tf.constant(3)) # Valid in Eager
|
||||
<tf.Tensor ... numpy=3>
|
||||
|
||||
>>> unconverted_graph_f(tf.constant(3)) # Error - not legal Graph code
|
||||
TypeError: Using a `tf.Tensor` ...
|
||||
```
|
||||
|
||||
AutoGraph transfers the Eager semantics to the graph function:
|
||||
|
||||
```
|
||||
>>> graph_f(tf.constant(3)) # Valid in AutoGraph
|
||||
<tf.Tensor ... numpy=3>
|
||||
```
|
||||
|
||||
### Subset of Eager
|
||||
|
||||
AutoGraph currently supports only a subset of Eager. For example, list operation
|
||||
semantics are not supported:
|
||||
|
||||
```
|
||||
def f(n):
|
||||
l = []
|
||||
for i in tf.range(n):
|
||||
l.append(i)
|
||||
return l
|
||||
|
||||
converted_f = tf.autograph.to_graph(f)
|
||||
```
|
||||
|
||||
```
|
||||
>>> f(3) # Valid in Eager
|
||||
[1, 2, 3]
|
||||
>>> converted_f(3) # Not valid in AutoGraph (by default)
|
||||
<<error>>
|
||||
```
|
||||
|
||||
### Experimental features
|
||||
|
||||
AutoGraph supports additional semantics which are not yet stable. This includes
|
||||
for example support for list semantics applied to `TensorArray`:
|
||||
|
||||
```
|
||||
def f(n):
|
||||
l = tf.TensorArray(...)
|
||||
for i in tf.range(n):
|
||||
l.append(i)
|
||||
return l
|
||||
|
||||
converted_f = tf.autograph.to_graph(f)
|
||||
experimental_converted_f = tf.autograph.to_graph(
|
||||
f, experimental_autograph_options=tf.autograph.experimental.Feature.LISTS)
|
||||
```
|
||||
|
||||
```
|
||||
>>> converted_f(3) # Not valid in AutoGraph (by default)
|
||||
<<error>>
|
||||
>>> experimental_converted_f(3) # Valid
|
||||
<<TensorArray object>>
|
||||
```
|
Loading…
x
Reference in New Issue
Block a user