1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Python_Ai_Road-eat_tensorflow2_in_30_days

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Chapter4-3.md 6.6 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 03.12.2024 15:14 374a95e

Правила использования AutoGraph

Есть три способа построения графа: статический, динамический и 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. Пояснения к правилам кодирования Autograph

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.

image.png

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/Python_Ai_Road-eat_tensorflow2_in_30_days.git
git@api.gitlife.ru:oschina-mirror/Python_Ai_Road-eat_tensorflow2_in_30_days.git
oschina-mirror
Python_Ai_Road-eat_tensorflow2_in_30_days
Python_Ai_Road-eat_tensorflow2_in_30_days
master