<commit_before># Как использовать TensorFlow 2.0?

В TensorFlow 2.0 были сделаны несколько изменений, которые позволят более продуктивно работать всем 
пользователям TensorFlow. В TensorFlow 2.0 были удалены
[ненужные APIs](https://github.com/tensorflow/community/blob/master/rfcs/20180827-api-names.md),
существующие и используемые API были проработаны 
([объединены RNN](https://github.com/tensorflow/community/blob/master/rfcs/20180920-unify-rnn-interface.md),
[а также оптимизаторы](https://github.com/tensorflow/community/blob/master/rfcs/20181016-optimizer-unification.md)),
улучшена интеграция с рабочей средой Python в режиме
[Eager execution](https://www.tensorflow.org/guide/eager).

Во многих
[запросах RFC](https://github.com/tensorflow/community/pulls?utf8=%E2%9C%93&q=is%3Apr)
объяснялись основные изменения, которые затронут TensorFlow 2.0. В этом документе
будет показан, как должен выглядеть процесс работы с новым TensorFlow 2.0.
Подразумевается, что ты уже знаком с TensorFlow 1.x.

## Краткий список основных изменений

### Чистка API

Многие API были либо
[удалены, либо перемещены](https://github.com/tensorflow/community/blob/master/rfcs/20180827-api-names.md)
в TF 2.0. Самыми крупными изменениями являются удаление `tf.app`, `tf.flags`, а также
`tf.logging` в пользу новой библиотеки с открытым исходным кодом
[absl-py](https://github.com/abseil/abseil-py), перемещение проектов, которые были в
`tf.contrib`, а также чистка основного имени `tf.*`: редко используемые функции 
были объединены в отдельные модули, например `tf.math`. Некоторые API были заменены
их 2.0 эквивалентами - `tf.summary`, `tf.keras.metrics`, и
`tf.keras.optimizers`. Самый простой способ автоматически переименовать все функции -
это воспользоваться [скриптом для обновления до 2.0](upgrade.md).

### Активный Eager execution

В TensorFlow 1.X от пользователя требовалось вручную строить
[абстрактное синтаксическое дерево](https://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE) (граф) при помощи API вызовов `tf.*`. Для этого было нужно вручную
компилировать дерево, передавая набор получаемых и входящих тензоров к вызову 
`session.run()`. TensorFlow 2.0 теперь выполняет все операции мгновенно (точно
так же, как и обычный Python), все графы и сессии теперь будут работать как
стандартное выполнение операций.

Раньше побочным продуктом eager execution метод `tf.control_dependencies()`,
который теперь не треубется, и все строки кода будут исполняться в последовательном
порядке, определенном `tf.function`. Сторонний код будет выполняться в 
определенном ему порядке.

### Никаких глобальных переменных

TensorFlow 1.X внутренне полагался на глобальные переменные. Когда ты вызывал
`tf.Variable()`, то эта переменная помещалась в стандартный граф и оставалась там
даже если уже было изменено имя, присвоенное этой переменной. Ты мог восстановить
эту переменную `tf.Variable`, но только если тебе было известно имя, которое было
присвоено ей при создании. В результате все механизмы были направлены на то, чтобы
помочь пользователю отыскать имя их переменных еще раз: `tf.get_global_step()`, 
`tf.global_variables_initializer()`, оптимизаторы, которые рассчитывали
градиенты по всем обучаемым перменным и так далее. В TensorFlow 2.0 были устранены
все эти механизмы ([Переменные 2.0 RFC](https://github.com/tensorflow/community/pull/11))
в пользу нового: следи за состоянием рабочих переменных! Если ты потеряешь `tf.Variable`
(например, ей будет присвоено новое имя), то старая будет удалена из памяти в порядке
процесса garbage collection.<commit_msg>met a typo while doing ты-check<commit_after># Как использовать TensorFlow 2.0?

В TensorFlow 2.0 были сделаны несколько изменений, которые позволят более продуктивно работать всем 
пользователям TensorFlow. В TensorFlow 2.0 были удалены
[ненужные APIs](https://github.com/tensorflow/community/blob/master/rfcs/20180827-api-names.md),
существующие и используемые API были проработаны 
([объединены RNN](https://github.com/tensorflow/community/blob/master/rfcs/20180920-unify-rnn-interface.md),
[а также оптимизаторы](https://github.com/tensorflow/community/blob/master/rfcs/20181016-optimizer-unification.md)),
улучшена интеграция с рабочей средой Python в режиме
[Eager execution](https://www.tensorflow.org/guide/eager).

Во многих
[запросах RFC](https://github.com/tensorflow/community/pulls?utf8=%E2%9C%93&q=is%3Apr)
объяснялись основные изменения, которые затронут TensorFlow 2.0. В этом документе
будет показан, как должен выглядеть процесс работы с новым TensorFlow 2.0.
Подразумевается, что ты уже знаком с TensorFlow 1.x.

## Краткий список основных изменений

### Чистка API

Многие API были либо
[удалены, либо перемещены](https://github.com/tensorflow/community/blob/master/rfcs/20180827-api-names.md)
в TF 2.0. Самыми крупными изменениями являются удаление `tf.app`, `tf.flags`, а также
`tf.logging` в пользу новой библиотеки с открытым исходным кодом
[absl-py](https://github.com/abseil/abseil-py), перемещение проектов, которые были в
`tf.contrib`, а также чистка основного имени `tf.*`: редко используемые функции 
были объединены в отдельные модули, например `tf.math`. Некоторые API были заменены
их 2.0 эквивалентами - `tf.summary`, `tf.keras.metrics`, и
`tf.keras.optimizers`. Самый простой способ автоматически переименовать все функции -
это воспользоваться [скриптом для обновления до 2.0](upgrade.md).

### Активный Eager execution

В TensorFlow 1.X от пользователя требовалось вручную строить
[абстрактное синтаксическое дерево](https://ru.wikipedia.org/wiki/%D0%90%D0%B1%D1%81%D1%82%D1%80%D0%B0%D0%BA%D1%82%D0%BD%D0%BE%D0%B5_%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%BE) (граф) при помощи API вызовов `tf.*`. Для этого было нужно вручную
компилировать дерево, передавая набор получаемых и входящих тензоров к вызову 
`session.run()`. TensorFlow 2.0 теперь выполняет все операции мгновенно (точно
так же, как и обычный Python), все графы и сессии теперь будут работать как
стандартное выполнение операций.

Раньше побочным продуктом eager execution был метод `tf.control_dependencies()`,
который теперь не треубется, и все строки кода будут исполняться в последовательном
порядке, определенном `tf.function`. Сторонний код будет выполняться в 
определенном ему порядке.

### Никаких глобальных переменных

TensorFlow 1.X внутренне полагался на глобальные переменные. Когда ты вызывал
`tf.Variable()`, то эта переменная помещалась в стандартный граф и оставалась там
даже если уже было изменено имя, присвоенное этой переменной. Ты мог восстановить
эту переменную `tf.Variable`, но только если тебе было известно имя, которое было
присвоено ей при создании. В результате все механизмы были направлены на то, чтобы
помочь пользователю отыскать имя их переменных еще раз: `tf.get_global_step()`, 
`tf.global_variables_initializer()`, оптимизаторы, которые рассчитывали
градиенты по всем обучаемым перменным и так далее. В TensorFlow 2.0 были устранены
все эти механизмы ([Переменные 2.0 RFC](https://github.com/tensorflow/community/pull/11))
в пользу нового: следи за состоянием рабочих переменных! Если ты потеряешь `tf.Variable`
(например, ей будет присвоено новое имя), то старая будет удалена из памяти в порядке
процесса garbage collection.
{'fraction_non_alphanumeric': 0.09817840878649879, 'fraction_numerical': 0.0348245379051701, 'mean_word_length': 5.939591078066915, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 18, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2934769', 'n_tokens_mistral': 3158, 'n_tokens_neox': 3546, 'n_words': 757}