¡Google I / O regresa del 18 al 20 de mayo! Reserva espacio y crea tu horario Regístrate ahora

Migración de TF1 a TF2 con TensorFlow Hub

En esta página, se explica cómo seguir usando TensorFlow Hub mientras se migra su 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 del hub.Module heredado para crear un tf.compat.v1.Graph como tf.contrib.v1.layers hace 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 (generalmente en el nuevo entorno de ejecución ávido 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 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 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 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 su uso en Keras junto con otras capas de Keras. (Incluso puede ser un contenedor conveniente para los modelos guardados cargados que se utilizan de otras formas).

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 TF2 en un estimador para entrenar con servidores de parámetros (o de lo contrario 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 "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 eliminar.

Carga de modelos heredados en formato TF1 Hub

Puede suceder que un nuevo modelo guardado 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 .

Usar API de nivel inferior

Los modelos de formato Legacy TF1 Hub 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 diccionario de funciones concretas de TensorFlow codificadas por nombres de firmas. Llamar a una función de este tipo calcula todas sus salidas, incluso si no se utilizan. (Esto es diferente de la evaluación perezosa del modo gráfico de TF1).