Когда использовать декоратор @ tf.function, а когда нет? Я знаю, что tf.function строит график. Но как узнать, когда строить графики? - PullRequest
5 голосов
/ 05 мая 2020

Я начал путешествие с Tensorflow, когда он уже вышел на 2.0.0, поэтому никогда не использовал графики и сеансы, как в версии 1. Но недавно встретил tf.function и автографы, которые меня устраивают. (но я знаю, что он используется только для шага поезда)

Теперь при чтении кода проекта многие люди используют декоратор tf.function для многих других функций, когда хотят построить графики. Но я не совсем понимаю их точку зрения. Как узнать, когда использовать график, а когда нет?

Кто-нибудь может мне помочь?

1 Ответ

3 голосов
/ 05 мая 2020

Решение

Декоратор @tf.function удобно преобразует функцию python в статический c график тензорного потока. TensorFlow по умолчанию работает в активном режиме, начиная с версии 2.0.0. Несмотря на то, что активный режим может помочь вам в построчном выполнении, это связано с относительно более медленным выполнением кода TensorFlow по сравнению со stati c -graph. Преобразование определенной функции в график c увеличивает скорость выполнения при обучении вашей модели.

Цитирование tf.function документация:

Функции могут быть быстрее чем нетерпеливый код, особенно для графиков с большим количеством мелких операций. Но для графиков с несколькими дорогостоящими операциями (например, свертки) вы можете не увидеть большого ускорения.

График stati c создается один раз и не обновляется, если функция вызывается повторно с разные значения (не передаются в качестве входных аргументов). Вам следует избегать использования @tf.function в таком сценарии ios или обновлять определение функции (если возможно), чтобы включить всю необходимую изменчивость через входные аргументы. Однако теперь, если ваша функция получает все свои входные данные через аргументы функции, тогда, если вы примените @tf.function, вы не увидите никаких проблем.

Вот пример.

### When not to use @tf.function ###
# some variable that changes with time
var = timestamp()

@tf.function
def func(*args, **kwargs):
    # your code
    return var

В приведенном выше примере функция func() хотя и зависит от var, но не обращается к переменной var через свои аргументы. Таким образом, когда @tf.function применяется в первый раз, он создает статический c -граф для func(). Однако, когда значение var изменится в будущем, оно не будет обновляться в статическом c -графе. См. это для большей ясности. Кроме того, я настоятельно рекомендую вам просмотреть раздел ссылок.

Для отладки

Цитирование источник

Вы можете использовать tf.config.experimental_run_functions_eagerly (который временно отключает запущенные функции как функции) в целях отладки.

Ссылки

  1. Лучшая производительность с tf.function
  2. Когда использовать tf.функцию
  3. TensorFlow 2.0: tf.function и AutoGraph
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...