Миграция с 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.

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

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

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

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

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

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

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

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

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

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

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