Migración de TF1 a TF2 con TensorFlow Hub

Esta página explica cómo seguir usando TensorFlow Hub mientras migras tu código de TensorFlow de TensorFlow 1 a TensorFlow 2. Complementa la guía general de migración de TensorFlow.

Para TF2, TF Hub se ha alejado de la API hub.Module heredada para crear un tf.compat.v1.Graph como lo hacen tf.contrib.v1.layers . En su lugar, ahora hay un hub.KerasLayer para usar junto con otras capas de Keras para construir un tf.keras.Model (normalmente en el nuevo entorno de ejecución entusiasta de TF2) y su método hub.load() subyacente para código TensorFlow de bajo nivel.

La API hub.Module permanece disponible en la biblioteca tensorflow_hub para su uso en TF1 y en el modo de compatibilidad TF1 de TF2. Solo puede cargar modelos en formato TF1 Hub .

La nueva API de hub.load() y hub.KerasLayer funciona para TensorFlow 1.15 (en modo ansioso y gráfico) y en TensorFlow 2. Esta nueva API puede cargar los nuevos recursos TF2 SavedModel y, con las restricciones establecidas en el modelo. guía de compatibilidad , los modelos heredados en formato TF1 Hub.

En general, se recomienda utilizar una API nueva siempre que sea posible.

Resumen de la nueva API

hub.load() es la nueva función de bajo nivel para cargar un modelo guardado desde TensorFlow Hub (o servicios compatibles). Envuelve tf.saved_model.load() de TF2; La Guía SavedModel de TensorFlow describe lo que puede hacer con el resultado.

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

La clase hub.KerasLayer llama hub.load() y adapta el resultado para usarlo en Keras junto con otras capas de Keras. (Incluso puede ser un contenedor conveniente para SavedModels cargados que se usan de otras maneras).

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

Muchos tutoriales muestran estas API en acción. Aquí hay unos ejemplos:

Uso de la nueva API en la formación de Estimator

Si utiliza un TF2 SavedModel en un Estimador para entrenar con servidores de parámetros (o de otro modo en una sesión TF1 con variables colocadas en dispositivos remotos), debe configurar experimental.share_cluster_devices_in_session en el ConfigProto de tf.Session, o de lo contrario obtendrá un error como "El dispositivo asignado '/job:ps/replica:0/task:0/device:CPU:0' no coincide con ningún dispositivo".

La opción necesaria se puede configurar como

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)

A partir de TF2.2, esta opción ya no es experimental y la pieza .experimental se puede eliminar.

Cargando modelos heredados en formato TF1 Hub

Puede suceder que un nuevo TF2 SavedModel aún no esté disponible para su caso de uso y necesite cargar un modelo heredado en formato TF1 Hub. A partir de la versión 0.7 de tensorflow_hub , puede usar el modelo heredado en formato TF1 Hub junto con hub.KerasLayer como se muestra a continuación:

m = hub.KerasLayer(handle)
tensor_out = m(tensor_in)

Además, KerasLayer expone la capacidad de especificar tags , signature , output_key y signature_outputs_as_dict para usos más específicos de modelos heredados en formato TF1 Hub y SavedModels heredados.

Para obtener más información sobre la compatibilidad del formato TF1 Hub, consulte la guía de compatibilidad de modelos .

Usando API de nivel inferior

Los modelos de formato Legacy TF1 Hub se pueden cargar a través de tf.saved_model.load . En lugar de

# DEPRECATED: TensorFlow 1
m = hub.Module(handle, tags={"foo", "bar"})
tensors_out_dict = m(dict(x1=..., x2=...), signature="sig", as_dict=True)

se recomienda utilizar:

# TensorFlow 2
m = hub.load(path, tags={"foo", "bar"})
tensors_out_dict = m.signatures["sig"](x1=..., x2=...)

En estos ejemplos, m.signatures es un dictado de funciones concretas de TensorFlow codificadas por nombres de firmas. Llamar a dicha función calcula todas sus salidas, incluso si no se utilizan. (Esto es diferente de la evaluación diferida del modo gráfico de TF1).