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

OSCHINA-MIRROR/Python_Ai_Road-eat_tensorflow2_in_30_days

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

4-3, Спецификация использования AutoGraph

Есть три способа построения вычислительного графа: статический вычислительный граф, динамический вычислительный граф и AutoGraph.

В TensorFlow 2.0 в основном используются динамический вычислительный граф и AutoGraph.

Динамический вычислительный граф легко отлаживать, он имеет высокую эффективность кодирования, но низкую производительность выполнения.

Статический вычислительный граф имеет высокую производительность выполнения, но его сложно отлаживать.

Механизм AutoGraph может преобразовывать динамические графики в статические вычислительные графики, сочетая преимущества производительности выполнения и эффективности кодирования.

Конечно, код, который может быть преобразован механизмом AutoGraph, не является неограниченным, необходимо следовать некоторым правилам кодирования, иначе преобразование может завершиться неудачно или не соответствовать ожиданиям.

Мы сосредоточимся на объяснении спецификации кодирования AutoGraph и принципа преобразования AutoGraph в статический график.

И объясним использование tf.Module для лучшего создания AutoGraph.

В этой статье мы рассмотрим спецификацию кодирования с использованием AutoGraph.

1, Краткое изложение спецификации кодирования AutoGraph

    1. Функции, отмеченные @tf.function, должны по возможности использовать функции TensorFlow, а не другие функции Python. Например, используйте tf.print вместо print, используйте tf.range вместо range, используйте tf.constant(True) вместо True.
    1. Избегайте определения tf.Variable внутри функции, отмеченной @tf.function.
    1. Отмеченные @tf.function функции не должны изменять переменные структуры данных, такие как списки или словари Python, за пределами этой функции.

2, Анализ спецификации кодирования AutoGraph

1, функции, отмеченные @tf.function, должны по возможности использовать функции TensorFlow, а не другие функции 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, избегайте определения tf.Variable внутри функции, отмеченной @tf.function.

# 避免在@tf.function修饰的函数内部定义tf.Variable.

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.

3, функции, отмеченные @tf.function, не должны изменять переменные структурного типа, такие как список Python или словарь, за пределами функции.

tensor_list = []

#@tf.function #加上这一行切换成Autograph结果将不符合预期!!!
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>]
tensor_list = []

@tf.function #加上这一行切换成Autograph结果将不符合预期!!!
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>]

Если вам нужно дальнейшее общение с автором по содержанию этой книги, вы можете оставить комментарий в общедоступной учётной записи «Алгоритмная кухня». Автор ответит в зависимости от времени и энергии.

Вы также можете ответить ключевым словом присоединиться к группе на задней панели общедоступной учётной записи, чтобы присоединиться к группе обсуждения читателей.

![Алгоритмная кухня, двухмерный штрих-код.jpg](./data/Алгоритмная кухня, двухмерный штрих-код.jpg)

Опубликовать ( 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