Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Migración de TF1 a TF2 con TensorFlow Hub

Esta página explica cómo seguir usando TensorFlow Hub mientras se migra el 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 ha alejado del hub.Module heredado hub.Module API de hub.Module para construir un tf.compat.v1.Graph como tf.contrib.v1.layers 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 ansioso de TF2) y su método hub.load() subyacente para el 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 el formato TF1 Hub .

La nueva API de hub.load() y hub.KerasLayer funciona para TensorFlow 1.15 (en modo entusiasta y gráfico) y en TensorFlow 2. Esta nueva API puede cargar los nuevos activos 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() TF2; La Guía de modelos guardados 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 guardados que se usan de otras maneras).

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

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

Usando la nueva API en el entrenamiento de Estimator

Si utiliza un modelo guardado TF2 en un estimador para entrenar con servidores de parámetros (o de lo contrario en una sesión TF1 con variables ubicadas en dispositivos remotos), debe configurar experimental.share_cluster_devices_in_session en tf.Session's ConfigProto, de lo contrario, obtendrá un error como "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 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 modelos guardados heredados.

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

Usar API de nivel inferior

Los modelos de formato TF1 Hub heredados se pueden cargar a través de tf.saved_model.load . En vez 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 m.signatures de las funciones concretas de TensorFlow con los nombres de las firmas. Llamar a tal función calcula todas sus salidas, incluso si no se utiliza. (Esto es diferente de la evaluación perezosa del modo gráfico de TF1).