Благодарим за настройку Google I/O. Посмотреть все сеансы по запросу Смотреть по запросу

Переход с TF1 на TF2 с помощью TensorFlow Hub

На этой странице объясняется, как продолжать использовать TensorFlow Hub при переносе кода TensorFlow с TensorFlow 1 на TensorFlow 2. Она дополняет общее руководство по миграции TensorFlow .

Для TF2 TF Hub отказался от устаревшего API hub.Module для построения tf.compat.v1.Graph , как это делает tf.contrib.v1.layers . Вместо этого теперь есть hub.KerasLayer для использования вместе с другими слоями Keras для построения tf.keras.Model (обычно в новой активной среде выполнения TF2) и лежащий в его основе hub.load() для низкоуровневого кода TensorFlow.

API hub.Module остается доступным в библиотеке tensorflow_hub для использования в TF1 и в режиме совместимости TF1 с TF2. Он может загружать модели только в формате TF1 Hub .

Новый API hub.load() и hub.KerasLayer работает для TensorFlow 1.15 (в режиме ожидания и графика) и в TensorFlow 2. Этот новый API может загружать новые активы TF2 SavedModel и, с учетом ограничений, изложенных в модели руководство по совместимости , устаревшие модели в формате TF1 Hub.

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

Краткое описание нового API

hub.load() — это новая низкоуровневая функция для загрузки SavedModel из TensorFlow Hub (или совместимых сервисов). Он обертывает tf.saved_model.load() TF2; Руководство TensorFlow SavedModel описывает, что вы можете сделать с результатом.

m = hub.load(handle)
outputs = m(inputs)

Класс hub.KerasLayer вызывает hub.load() и адаптирует результат для использования в Keras вместе с другими слоями Keras. (Это может быть даже удобной оболочкой для загруженных SavedModels, используемых другими способами.)

model = tf.keras.Sequential([
    hub.KerasLayer(handle),
    ...])

Многие руководства показывают эти API в действии. См. в частности

Использование нового API в обучении Estimator

Если вы используете TF2 SavedModel в Estimator для обучения с серверами параметров (или иным образом в сеансе TF1 с переменными, размещенными на удаленных устройствах), вам необходимо установить Experiment.share_cluster_devices_in_session в experimental.share_cluster_devices_in_session tf.Session, иначе вы получите сообщение об ошибке. например, «Назначенное устройство «/job:ps/replica:0/task:0/device:CPU:0» не соответствует ни одному устройству».

Необходимую опцию можно установить так

session_config = tf.compat.v1.ConfigProto()
session_config.experimental.share_cluster_devices_in_session = True
run_config = tf.estimator.RunConfig(..., session_config=session_config)
estimator = tf.estimator.Estimator(..., config=run_config)

Начиная с TF2.2, эта опция больше не является экспериментальной, и часть .experimental можно удалить.

Загрузка устаревших моделей в формате TF1 Hub

Может случиться так, что новая сохраненная модель TF2 еще недоступна для вашего варианта использования, и вам нужно загрузить устаревшую модель в формате TF1 Hub. Начиная с версии 0.7 tensorflow_hub , вы можете использовать устаревшую модель в формате TF1 Hub вместе с hub.KerasLayer , как показано ниже:

m = hub.KerasLayer(handle)
tensor_out = m(tensor_in)

Кроме того KerasLayer предоставляет возможность указывать tags , signature , output_key и signature_outputs_as_dict для более конкретного использования устаревших моделей в формате TF1 Hub и устаревших SavedModels.

Дополнительную информацию о совместимости форматов TF1 Hub смотрите в руководстве по совместимости моделей .

Использование API более низкого уровня

Модели формата Legacy TF1 Hub можно загрузить через tf.saved_model.load . Вместо того

# DEPRECATED: TensorFlow 1
m = hub.Module(handle, tags={"foo", "bar"})
tensors_out_dict = m(dict(x1=..., x2=...), signature="sig", as_dict=True)

рекомендуется использовать:

# TensorFlow 2
m = hub.load(path, tags={"foo", "bar"})
tensors_out_dict = m.signatures["sig"](x1=..., x2=...)

В этих примерах m.signatures — это набор конкретных функций TensorFlow с именами сигнатур. Вызов такой функции вычисляет все ее выходные данные, даже если они не используются. (Это отличается от ленивой оценки графического режима TF1.)