Есть три способа построения графа: статический, динамический и Autograph.
TensorFlow 2.X использует динамический граф и Autograph.
Динамический граф проще отлаживать, но он менее эффективен при выполнении.
Статический граф эффективен при выполнении, но его сложнее отлаживать.
Механизм Autograph преобразует динамический граф в статический, учитывая эффективность как выполнения, так и кодирования.
Существуют определённые правила для кода, который может быть преобразован с помощью Autograph, иначе это может привести к сбою или неожиданным результатам.
Мы собираемся представить правила кодирования Autograph и его механизм преобразования в статический граф, а также рассказать о том, как создать Autograph с помощью tf.Module
.
В этом разделе представлены правила кодирования с использованием Autograph. В следующем разделе мы рассмотрим механизмы Autograph и объясним логику, лежащую в основе этих правил.
<!-- #region -->
### 1. Краткое изложение правил кодирования Autograph
* 1. Следует по возможности использовать функции, определённые в TensorFlow, которые декорируются `@tf.function`, вместо функций Python. Например, следует использовать `tf.print` вместо `print`; `tf.range` вместо `range`; `tf.constant(True)` вместо `True`.
* 2. Избегайте определения `tf.Variable` внутри декоратора `@tf.function`.
* 3. Функции, декорированные `@tf.function`, не могут изменять переменные типов данных struct вне функции, такие как список Python, словарь и т. д.
<!-- #endregion -->
```python
2.1 Следует использовать функции, определённые в TensorFlow, которые декорируются @tf.function
, вместо функций Python.
import numpy as np
import tensorflow as tf
@tf.function
def np_random():
a = np.random.randn(3,3)
tf.print(a)
@tf.function
def tf_random():
a = tf.random.normal((3,3))
tf.print(a)
# Те же результаты после каждого выполнения np_random
np_random()
np_random()
array([[ 0.22619201, -0.4550123 , -0.42587565],
[ 0.05429906, 0.2312667 , -1.44819738],
[ 0.36571796, 1.45578986, -1.05348983]])
array([[ 0.22619201, -0.4550123 , -0.42587565],
[ 0.05429906, 0.2312667 , -1.44819738],
[ 0.36571796, 1.45578986, -1.05348983]])
# Новые случайные числа генерируются после каждого выполнения tf_random
tf_random()
tf_random()
[[-1.38956189 -0.394843668 0.420657277]
[2.87235498 -1.33740318 -0.533843279]
[0.918233037 0.118598573 -0.399486482]]
[[-0.858178258 1.67509317 0.511889517]
[-0.545829177 -2.20118237 -0.968222201]
[0.733958483 -0.61904633 0.77440238]]
2.2 Избегайте определения tf.Variable
внутри декоратора @tf.function
.
# Избегайте определения tf.Variable внутри декоратора @tf.function.
x = tf.Variable(1.0,dtype=tf.float32)
@tf.function
def outer_var():
x.assign_add(1.0)
tf.print(x)
return(x)
outer_var()
outer_var()
@tf.function
def inner_var():
x = tf.Variable(1.0,dtype = tf.float32)
x.assign_add(1.0)
tf.print(x)
return(x)
# Ошибка после выполнения
#inner_var()
#inner_var()
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-12-c95a7c3c1ddd> in <module>
7
8 # Ошибка после выполнения
----> 9 inner_var()
10 inner_var()
~/anaconda3/lib/python3.7/site-packages/tensorflow_core/python/eager/def_function.py in __call__(self, *args, **kwds)
566 xla_context.Exit()
567 else:
--> 568 result = self._call(*args, **kwds)
569
570 if tracing_count == self._get_tracing_count():
......
ValueError: tf.function-decorated function tried to create variables on non-first call.
2.3 Функции, декорированные @tf.function
, не могут изменять переменные типов данных struct вне функции, например, список Python, ```
tensor_list = []
#@tf.function # Autograph will result in something unexpected if executing this line def append_tensor(x): tensor_list.append(x) return tensor_list
append_tensor(tf.constant(5.0)) append_tensor(tf.constant(6.0)) print(tensor_list)
[<tf.Tensor: shape=(), dtype=float32, numpy=5.0>, <tf.Tensor: shape=(), dtype=float32, numpy=6.0>]
```python
tensor_list = []
@tf.function # Autograph will result in something unexpected if executing this line
def append_tensor(x):
tensor_list.append(x)
return tensor_list
append_tensor(tf.constant(5.0))
append_tensor(tf.constant(6.0))
print(tensor_list)
[<tf.Tensor 'x:0' shape=() dtype=float32>]
Пожалуйста, оставляйте комментарии в официальном аккаунте WeChat «Python与算法之美» (Elegance of Python and Algorithms), если хотите пообщаться с автором о содержании. Автор постарается ответить, учитывая ограниченное время.
Также приглашаем присоединиться к групповому чату с другими читателями, ответив 加群 (join group) в официальном аккаунте WeChat.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )