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