На этой странице объясняется, как продолжать использовать 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.)