Tf1.x -& gt; Обзор миграции TF2

TensorFlow 2 принципиально отличается от TF1.x по нескольким причинам. Вы по-прежнему можете запускать немодифицированный код TF1.x ( за исключением contrib ) для двоичных установок TF2 следующим образом:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

Однако это не поддерживает поведение и API TF2 и может не работать должным образом с кодом, написанным для TF2. Если вы не работаете с активным поведением TF2, вы фактически запускаете TF1.x поверх установки TF2. Прочтите руководство по поведению TF1 и TF2 , чтобы узнать больше о том, чем TF2 отличается от TF1.x.

В этом руководстве представлен обзор процесса миграции кода TF1.x в TF2. Это позволяет вам воспользоваться преимуществами новых и будущих улучшений функций, а также сделать ваш код более простым, более производительным и легким в обслуживании.

Если вы используете API высокого уровня tf.keras и обучаетесь исключительно с помощью model.fit , ваш код должен быть более или менее полностью совместим с TF2, за исключением следующих оговорок:

Процесс миграции TF2

Перед миграцией узнайте о поведении и различиях API между TF1.x и TF2, прочитав руководство .

  1. Запустите автоматический скрипт, чтобы преобразовать часть использования API TF1.x в tf.compat.v1 .
  2. Удалите старые символы tf.contrib (проверьте TF Addons и TF-Slim ).
  3. Запустите прямые проходы модели TF1.x в TF2 с включенным нетерпеливым выполнением.
  4. Обновите код TF1.x для циклов обучения и сохранения/загрузки моделей до эквивалентов TF2.
  5. (Необязательно) Перенесите совместимые с TF2 API-интерфейсы tf.compat.v1 в идиоматические API-интерфейсы TF2.

В следующих разделах подробно описаны шаги, описанные выше.

Запустите скрипт преобразования символов

Это выполняет начальный этап переписывания символов вашего кода для работы с двоичными файлами TF 2.x, но не сделает ваш код идиоматическим для TF 2.x и не сделает ваш код автоматически совместимым с поведением TF2.

Скорее всего, ваш код по-прежнему будет использовать конечные точки tf.compat.v1 для доступа к заполнителям, сеансам, коллекциям и другим функциям в стиле TF1.x.

Прочтите руководство , чтобы узнать больше о лучших практиках использования сценария преобразования символов.

Удалить использование tf.contrib

Модуль tf.contrib прекращен, а несколько его подмодулей интегрированы в основной API TF2. Остальные подмодули теперь выделены в другие проекты, такие как TF IO и TF Addons .

Большая часть старого кода TF1.x использует библиотеку Slim , которая была упакована вместе с TF1.x как tf.contrib.layers . При переносе кода Slim в TF2 измените использование Slim API, чтобы указать на пакет tf-slim pip . Затем прочтите руководство по сопоставлению моделей , чтобы узнать, как преобразовать код Slim.

В качестве альтернативы, если вы используете предварительно обученные модели Slim, вы можете рассмотреть возможность опробовать предварительно обученные модели Keras из tf.keras.applications или TF2 SavedModel TF Hub , экспортированные из исходного кода Slim.

Запускайте прямые проходы модели TF1.x с включенным поведением TF2.

Отслеживайте переменные и потери

TF2 не поддерживает глобальные коллекции.

Стремительное выполнение в TF2 не поддерживает API на основе коллекций tf.Graph . Это влияет на то, как вы создаете и отслеживаете переменные.

Для нового кода TF2 вы должны использовать tf.Variable вместо v1.get_variable и использовать объекты Python для сбора и отслеживания переменных вместо tf.compat.v1.variable_scope . Обычно это будет одно из:

Объедините списки переменных (например tf.Graph.get_collection(tf.GraphKeys.VARIABLES) ) с атрибутами .variables и .trainable_variables объектов Layer , Module или Model .

Классы Layer и Model реализуют несколько других свойств, которые устраняют необходимость в глобальных коллекциях. Их свойство .losses может заменить использование коллекции tf.GraphKeys.LOSSES .

Прочтите руководство по сопоставлению моделей , чтобы узнать больше об использовании прокладок моделирования кода TF2 для встраивания существующего кода на основе get_variable variable_scope внутрь Layers , Models и Modules . Это позволит вам выполнять проходы вперед с активным выполнением без серьезных перезаписей.

Адаптация к другим изменениям поведения

Если руководства по сопоставлению модели самого по себе недостаточно для дальнейшего прохождения вашей модели других изменений поведения, которые могут быть более подробными, см. Руководство по поведению TF1.x и TF2, чтобы узнать о других изменениях поведения и о том, как вы можете к ним адаптироваться. . Также ознакомьтесь с подробностями создания новых слоев и моделей в руководстве по созданию подклассов .

Проверка ваших результатов

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

Обновление кода обучения, оценки и импорта/экспорта

Циклы обучения TF1.x, построенные с использованием tf.estimator.Estimator в стиле v1.Session и других подходов на основе коллекций, несовместимы с новым поведением TF2. Важно перенести весь обучающий код TF1.x, поскольку его объединение с кодом TF2 может привести к неожиданному поведению.

Для этого вы можете выбрать одну из нескольких стратегий.

Подход самого высокого уровня — использовать tf.keras . Функции высокого уровня в Keras управляют множеством деталей низкого уровня, которые можно легко упустить, если вы пишете собственный цикл обучения. Например, они автоматически собирают потери от регуляризации и устанавливают аргумент training=True при вызове модели.

Обратитесь к руководству по миграции Estimator , чтобы узнать, как можно перенести код tf.estimator.Estimator для использования ванильных и пользовательских циклов обучения tf.keras .

Пользовательские циклы обучения дают вам более точный контроль над вашей моделью, например отслеживание весов отдельных слоев. Прочтите руководство по созданию циклов обучения с нуля , чтобы узнать, как использовать tf.GradientTape для получения весов модели и использования их для обновления модели.

Преобразование оптимизаторов TF1.x в оптимизаторы Keras

Оптимизаторы в tf.compat.v1.train , такие как оптимизатор Адама и оптимизатор градиентного спуска , имеют эквиваленты в tf.keras.optimizers .

В таблице ниже показано, как можно преобразовать эти устаревшие оптимизаторы в их эквиваленты Keras. Вы можете напрямую заменить версию TF1.x на версию TF2, если не требуются дополнительные действия (например, обновление скорости обучения по умолчанию ).

Обратите внимание, что преобразование ваших оптимизаторов может сделать старые контрольные точки несовместимыми .

TF1.x ТФ2 Дополнительные шаги
`tf.v1.train.GradientDescentOptimizer` tf.keras.optimizers.SGD Никто
`tf.v1.train.MomentumOptimizer` tf.keras.optimizers.SGD Включите аргумент `импульс`
`tf.v1.train.AdamOptimizer` tf.keras.optimizers.Adam Переименуйте аргументы beta1 и beta2 в beta_1 и beta_2.
`tf.v1.train.RMSPropOptimizer` tf.keras.optimizers.RMSprop Переименуйте аргумент `decay` в `rho`.
`tf.v1.train.AdadeltaOptimizer` tf.keras.optimizers.Adadelta Никто
`tf.v1.train.AdagradOptimizer` tf.keras.optimizers.Adagrad Никто
`tf.v1.train.FtrlOptimizer` tf.keras.optimizers.Ftrl Удалите аргументы `accum_name` и `linear_name`.
`tf.contrib.AdamaxOptimizer` tf.keras.optimizers.Adamax Переименуйте аргументы beta1 и beta2 в beta_1 и beta_2.
`tf.contrib.Надам` tf.keras.optimizers.Nadam Переименуйте аргументы beta1 и beta2 в beta_1 и beta_2.

Обновление конвейеров ввода данных

Существует много способов передать данные в модель tf.keras . В качестве входных данных они будут принимать генераторы Python и массивы Numpy.

Рекомендуемый способ подачи данных в модель — использовать пакет tf.data , который содержит коллекцию высокопроизводительных классов для управления данными. dataset , принадлежащие tf.data эффективны, выразительны и хорошо интегрируются с TF2.

Их можно передать непосредственно методу tf.keras.Model.fit .

model.fit(dataset, epochs=5)

Их можно перебирать напрямую через стандартный Python:

for example_batch, label_batch in dataset:
    break

Если вы все еще используете tf.queue , они теперь поддерживаются только как структуры данных, а не как входные конвейеры.

Вам также следует перенести весь код предварительной обработки объектов, использующий tf.feature_columns . Более подробную информацию можно найти в руководстве по миграции .

Сохранение и загрузка моделей

TF2 использует контрольные точки на основе объектов. Прочтите руководство по миграции контрольных точек , чтобы узнать больше о миграции контрольных точек TF1.x на основе имен. Также прочтите руководство по контрольным точкам в основной документации TensorFlow.

Для сохраненных моделей нет серьезных проблем с совместимостью. Прочтите руководство SavedModel для получения дополнительной информации о миграции SavedModel из TF1.x в TF2. В общем,

  • Сохраненные_модели из TF1.x работают в TF2.
  • Сохраненные_модели TF2 работают в TF1.x, если поддерживаются все операции.

Также обратитесь к разделу GraphDef в руководстве по миграции SavedModel для получения дополнительной информации о работе с объектами Graph.pb и Graph.pbtxt .

(Необязательно) Перенесите символы tf.compat.v1 .

Модуль tf.compat.v1 содержит полный API TF1.x с его исходной семантикой.

Даже после выполнения описанных выше шагов и получения кода, полностью совместимого со всеми вариантами поведения TF2, вполне вероятно, что будет много упоминаний об API-интерфейсах compat.v1 , совместимых с TF2. Вам следует избегать использования устаревших API-интерфейсов compat.v1 для любого нового кода, который вы пишете, хотя они будут продолжать работать с вашим уже написанным кодом.

Однако вы можете перенести существующие способы использования на устаревшие API TF2. Строки документации отдельных символов compat.v1 часто объясняют, как перенести их на устаревшие API TF2. Кроме того, в этом также может помочь раздел руководства по сопоставлению моделей, посвященный поэтапному переходу на идиоматические API TF2 .

Ресурсы и дополнительная литература

Как упоминалось ранее, рекомендуется перенести весь код TF1.x в TF2. Чтобы узнать больше, прочтите руководства в разделе «Миграция на TF2» руководства TensorFlow.

,

TensorFlow 2 принципиально отличается от TF1.x по нескольким причинам. Вы по-прежнему можете запускать немодифицированный код TF1.x ( за исключением contrib ) для двоичных установок TF2 следующим образом:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

Однако это не поддерживает поведение и API TF2 и может не работать должным образом с кодом, написанным для TF2. Если вы не работаете с активным поведением TF2, вы фактически запускаете TF1.x поверх установки TF2. Прочтите руководство по поведению TF1 и TF2 , чтобы узнать больше о том, чем TF2 отличается от TF1.x.

В этом руководстве представлен обзор процесса миграции кода TF1.x в TF2. Это позволяет вам воспользоваться преимуществами новых и будущих улучшений функций, а также сделать ваш код более простым, более производительным и легким в обслуживании.

Если вы используете высокоуровневые API tf.keras и обучаетесь исключительно с помощью model.fit , ваш код должен быть более или менее полностью совместим с TF2, за исключением следующих оговорок:

Процесс миграции TF2

Перед миграцией узнайте о поведении и различиях API между TF1.x и TF2, прочитав руководство .

  1. Запустите автоматический скрипт, чтобы преобразовать часть использования API TF1.x в tf.compat.v1 .
  2. Удалите старые символы tf.contrib (проверьте TF Addons и TF-Slim ).
  3. Запустите прямые проходы модели TF1.x в TF2 с включенным нетерпеливым выполнением.
  4. Обновите код TF1.x для циклов обучения и сохранения/загрузки моделей до эквивалентов TF2.
  5. (Необязательно) Перенесите совместимые с TF2 API-интерфейсы tf.compat.v1 в идиоматические API-интерфейсы TF2.

В следующих разделах подробно описаны шаги, описанные выше.

Запустите скрипт преобразования символов

Это выполняет начальный этап переписывания символов вашего кода для работы с двоичными файлами TF 2.x, но не сделает ваш код идиоматическим для TF 2.x и не сделает ваш код автоматически совместимым с поведением TF2.

Скорее всего, ваш код по-прежнему будет использовать конечные точки tf.compat.v1 для доступа к заполнителям, сеансам, коллекциям и другим функциям в стиле TF1.x.

Прочтите руководство , чтобы узнать больше о лучших практиках использования сценария преобразования символов.

Удалить использование tf.contrib

Модуль tf.contrib прекращен, а несколько его подмодулей интегрированы в основной API TF2. Остальные подмодули теперь выделены в другие проекты, такие как TF IO и TF Addons .

Большая часть старого кода TF1.x использует библиотеку Slim , которая была упакована вместе с TF1.x как tf.contrib.layers . При переносе кода Slim в TF2 измените использование Slim API, чтобы указать на пакет tf-slim pip . Затем прочтите руководство по сопоставлению моделей , чтобы узнать, как преобразовать код Slim.

В качестве альтернативы, если вы используете предварительно обученные модели Slim, вы можете рассмотреть возможность опробовать предварительно обученные модели Keras из tf.keras.applications или TF2 SavedModel TF Hub , экспортированные из исходного кода Slim.

Запускайте прямые проходы модели TF1.x с включенным поведением TF2.

Отслеживайте переменные и потери

TF2 не поддерживает глобальные коллекции.

Стремительное выполнение в TF2 не поддерживает API на основе коллекций tf.Graph . Это влияет на то, как вы создаете и отслеживаете переменные.

Для нового кода TF2 вы должны использовать tf.Variable вместо v1.get_variable и использовать объекты Python для сбора и отслеживания переменных вместо tf.compat.v1.variable_scope . Обычно это будет одно из:

Объедините списки переменных (например tf.Graph.get_collection(tf.GraphKeys.VARIABLES) ) с атрибутами .variables и .trainable_variables объектов Layer , Module или Model .

Классы Layer и Model реализуют несколько других свойств, которые устраняют необходимость в глобальных коллекциях. Их свойство .losses может заменить использование коллекции tf.GraphKeys.LOSSES .

Прочтите руководство по сопоставлению моделей , чтобы узнать больше об использовании прокладок моделирования кода TF2 для встраивания существующего кода на основе get_variable variable_scope внутрь Layers , Models и Modules . Это позволит вам выполнять проходы вперед с активным выполнением без серьезных перезаписей.

Адаптация к другим изменениям поведения

Если руководства по сопоставлению модели само по себе недостаточно для дальнейшего прохождения вашей модели других изменений поведения, которые могут быть более подробными, см. Руководство по поведению TF1.x и TF2, чтобы узнать о других изменениях поведения и о том, как вы можете к ним адаптироваться. . Также ознакомьтесь с подробностями создания новых слоев и моделей в руководстве по созданию подклассов .

Проверка ваших результатов

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

Обновление кода обучения, оценки и импорта/экспорта

Циклы обучения TF1.x, построенные с использованием tf.estimator.Estimator в стиле v1.Session и других подходов на основе коллекций, несовместимы с новым поведением TF2. Важно перенести весь обучающий код TF1.x, поскольку его объединение с кодом TF2 может привести к неожиданному поведению.

Для этого вы можете выбрать одну из нескольких стратегий.

Подход самого высокого уровня — использовать tf.keras . Функции высокого уровня в Keras управляют множеством деталей низкого уровня, которые можно легко упустить, если вы пишете собственный цикл обучения. Например, они автоматически собирают потери от регуляризации и устанавливают аргумент training=True при вызове модели.

Обратитесь к руководству по миграции Estimator , чтобы узнать, как можно перенести код tf.estimator.Estimator для использования ванильных и пользовательских циклов обучения tf.keras .

Пользовательские циклы обучения дают вам более точный контроль над вашей моделью, например отслеживание весов отдельных слоев. Прочтите руководство по созданию циклов обучения с нуля , чтобы узнать, как использовать tf.GradientTape для получения весов модели и использования их для обновления модели.

Преобразование оптимизаторов TF1.x в оптимизаторы Keras

Оптимизаторы в tf.compat.v1.train , такие как оптимизатор Адама и оптимизатор градиентного спуска , имеют эквиваленты в tf.keras.optimizers .

В таблице ниже показано, как можно преобразовать эти устаревшие оптимизаторы в их эквиваленты Keras. Вы можете напрямую заменить версию TF1.x на версию TF2, если не требуются дополнительные действия (например, обновление скорости обучения по умолчанию ).

Обратите внимание, что преобразование ваших оптимизаторов может сделать старые контрольные точки несовместимыми .

TF1.x ТФ2 Дополнительные шаги
`tf.v1.train.GradientDescentOptimizer` tf.keras.optimizers.SGD Никто
`tf.v1.train.MomentumOptimizer` tf.keras.optimizers.SGD Включите аргумент `импульс`
`tf.v1.train.AdamOptimizer` tf.keras.optimizers.Adam Переименуйте аргументы beta1 и beta2 в beta_1 и beta_2.
`tf.v1.train.RMSPropOptimizer` tf.keras.optimizers.RMSprop Переименуйте аргумент `decay` в `rho`.
`tf.v1.train.AdadeltaOptimizer` tf.keras.optimizers.Adadelta Никто
`tf.v1.train.AdagradOptimizer` tf.keras.optimizers.Adagrad Никто
`tf.v1.train.FtrlOptimizer` tf.keras.optimizers.Ftrl Удалите аргументы `accum_name` и `linear_name`.
`tf.contrib.AdamaxOptimizer` tf.keras.optimizers.Adamax Переименуйте аргументы beta1 и beta2 в beta_1 и beta_2.
`tf.contrib.Надам` tf.keras.optimizers.Nadam Переименуйте аргументы beta1 и beta2 в beta_1 и beta_2.

Обновление конвейеров ввода данных

Существует много способов передать данные в модель tf.keras . В качестве входных данных они будут принимать генераторы Python и массивы Numpy.

Рекомендуемый способ подачи данных в модель — использовать пакет tf.data , который содержит коллекцию высокопроизводительных классов для управления данными. dataset , принадлежащие tf.data эффективны, выразительны и хорошо интегрируются с TF2.

Их можно передать непосредственно методу tf.keras.Model.fit .

model.fit(dataset, epochs=5)

Их можно перебирать напрямую через стандартный Python:

for example_batch, label_batch in dataset:
    break

Если вы все еще используете tf.queue , теперь они поддерживаются только как структуры данных, а не как входные конвейеры.

Вам также следует перенести весь код предварительной обработки объектов, использующий tf.feature_columns . Более подробную информацию можно найти в руководстве по миграции .

Сохранение и загрузка моделей

TF2 использует контрольные точки на основе объектов. Прочтите руководство по миграции контрольных точек , чтобы узнать больше о миграции контрольных точек TF1.x на основе имен. Также прочтите руководство по контрольным точкам в основной документации TensorFlow.

Для сохраненных моделей нет серьезных проблем с совместимостью. Прочтите руководство SavedModel для получения дополнительной информации о миграции SavedModel из TF1.x в TF2. В общем,

  • Сохраненные_модели из TF1.x работают в TF2.
  • Сохраненные_модели TF2 работают в TF1.x, если поддерживаются все операции.

Также обратитесь к разделу GraphDef в руководстве по миграции SavedModel для получения дополнительной информации о работе с объектами Graph.pb и Graph.pbtxt .

(Необязательно) Перенесите символы tf.compat.v1 .

Модуль tf.compat.v1 содержит полный API TF1.x с его исходной семантикой.

Даже после выполнения описанных выше шагов и получения кода, полностью совместимого со всеми вариантами поведения TF2, вполне вероятно, что будет много упоминаний об API-интерфейсах compat.v1 , совместимых с TF2. Вам следует избегать использования этих устаревших API-интерфейсов compat.v1 для любого нового кода, который вы пишете, хотя они будут продолжать работать с вашим уже написанным кодом.

Однако вы можете перенести существующие способы использования на устаревшие API TF2. Строки документации отдельных символов compat.v1 часто объясняют, как перенести их на устаревшие API TF2. Кроме того, в этом также может помочь раздел руководства по сопоставлению моделей, посвященный поэтапному переходу на идиоматические API TF2 .

Ресурсы и дополнительная литература

Как упоминалось ранее, рекомендуется перенести весь код TF1.x в TF2. Чтобы узнать больше, прочтите руководства в разделе «Миграция на TF2» руководства TensorFlow.