Миграция с 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 при обучении оценщика

Если вы используете TF2 SavedModel в оценщике для обучения с серверами параметров (или иным образом в сеансе 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.)