На этой странице объясняется, как продолжать использовать 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.
API hub.Module
остается доступным в библиотеке tensorflow_hub
для использования в TF1 и в режиме совместимости TF1 с TF2. Он может загружать модели только в формате TF1 Hub .
Новый API hub.load()
и hub.KerasLayer
работает для TensorFlow 1.15 (в режиме ожидания и графика) и в TensorFlow 2. Этот новый API может загружать новые активы TF2 SavedModel и, с учетом ограничений, изложенных в модели руководство по совместимости , устаревшие модели в формате TF1 Hub.
В общем, рекомендуется использовать новый API везде, где это возможно.
Краткое описание нового API
hub.load()
— это новая низкоуровневая функция для загрузки SavedModel из TensorFlow Hub (или совместимых сервисов). Он обертывает tf.saved_model.load()
TF2; Руководство TensorFlow SavedModel описывает, что вы можете сделать с результатом.
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 с переменными, размещенными на удаленных устройствах), вам необходимо установить Experiment.share_cluster_devices_in_session в experimental.share_cluster_devices_in_session
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. Начиная с версии 0.7 tensorflow_hub
, вы можете использовать устаревшую модель в формате 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 более низкого уровня
Модели формата Legacy 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.)