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 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
(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 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 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. A continuación se muestran algunos 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).