Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Миграция с 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 делают tf.contrib.v1.layers . Вместо этого теперь есть hub.KerasLayer для использования вместе с другими слоями tf.keras.Model для построения 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 (в режиме eager и graph) и в TensorFlow 2. Этот новый API может загружать новые активы TF2 SavedModel , а также с ограничениями, изложенными в модели. Руководство по совместимости , унаследованные модели в формате TF1 Hub.

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

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

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

 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 с переменными, размещенными на удаленных устройствах), вам нужно установить experimental.share_cluster_devices_in_session в ConfigProto 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 SavedModel еще не доступна для вашего варианта использования, и вам нужно загрузить устаревшую модель в формате TF1 Hub. Начиная с tensorflow_hub 0.7, вы можете использовать устаревшую модель в формате 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 нижнего уровня

Устаревшие модели формата 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 представляет собой конкретную функцию m.signatures на именах сигнатур. Вызов такой функции вычисляет все ее выходные данные, даже если они не используются. (Это отличается от ленивой оценки режима графика TF1.)