Migración de TF1 a TF2 con TensorFlow Hub

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

Para TF2, TF Hub se alejó del legado hub.Module API para construir un tf.compat.v1.Graph como lo hacen tf.contrib.v1.layers . En cambio, ahora hay un hub.KerasLayer para usar junto con otras capas de Keras para construir un tf.keras.Model (generalmente en el nuevo entorno de ejecución entusiasta de TF2) y su método subyacente hub.load() 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 activos de 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 nueva API 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 del modelo guardado de TensorFlow describe lo que puede hacer con el resultado.

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

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

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

Muchos tutoriales muestran estas API en acción. Ver en particular

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

Si usa un modelo guardado de TF2 en un Estimator para entrenar con servidores de parámetros (o de otro modo en una sesión de TF1 con variables ubicadas en dispositivos remotos), debe configurar experimental.share_cluster_devices_in_session en el ConfigProto de tf.Session, de lo contrario obtendrá un error como "El dispositivo asignado '/trabajo:ps/réplica:0/tarea:0/dispositivo: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 descartar.

Carga de modelos heredados en formato TF1 Hub

Puede suceder que un nuevo modelo guardado de TF2 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 modelos guardados heredados.

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

Uso de API de nivel inferior

Los modelos de formato TF1 Hub heredados se pueden cargar a través 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 dict de funciones concretas de TensorFlow codificadas por nombres de firma. Al llamar a una función de este tipo, se calculan todas sus salidas, incluso si no se utilizan. (Esto es diferente de la evaluación perezosa del modo gráfico de TF1).