Problemas habituales

Si su problema no aparece aquí, busque los problemas de github antes de completar uno nuevo.

TypeError: el objeto 'AutoTrackable' no se puede invocar

# BAD: Raises error
embed = hub.load('https://tfhub.dev/google/nnlm-en-dim128/1')
embed(['my text', 'batch'])

Este error surge con frecuencia al cargar modelos en formato TF1 Hub con la API hub.load() en TF2. Agregar la firma correcta debería solucionar este problema. Consulte la guía de migración de TF-Hub para TF2 para obtener más detalles sobre cómo pasar a TF2 y el uso de modelos en formato TF1 Hub en TF2.


embed = hub.load('https://tfhub.dev/google/nnlm-en-dim128/1')
embed.signatures['default'](['my text', 'batch'])

No se puede descargar un módulo

En el proceso de utilizar un módulo desde una URL, pueden aparecer muchos errores debido a la pila de red. A menudo, este es un problema específico de la máquina que ejecuta el código y no un problema con la biblioteca. Aquí hay una lista de los más comunes:

  • "EOF ocurrió en violación del protocolo" : es probable que este problema se genere si la versión de Python instalada no admite los requisitos de TLS del servidor que aloja el módulo. En particular, se sabe que Python 2.7.5 no resuelve módulos del dominio tfhub.dev. REVISIÓN : actualice a una versión más reciente de Python.

  • "No se puede verificar el certificado de tfhub.dev" : es probable que este problema se genere si algo en la red intenta actuar como gTLD de desarrollo. Antes de que se usara .dev como gTLD, los desarrolladores y los marcos a veces usaban nombres .dev para ayudar a probar el código. REVISIÓN: Identifique y reconfigure el software que intercepta la resolución de nombres en el dominio ".dev".

  • Errores al escribir en el directorio de caché /tmp/tfhub_modules (o similar): consulte Almacenamiento en caché para saber qué es y cómo cambiar su ubicación.

Si los errores y correcciones anteriores no funcionan, se puede intentar descargar manualmente un módulo simulando el protocolo de adjuntar ?tf-hub-format=compressed a la URL para descargar un archivo comprimido tar que debe descomprimirse manualmente en un archivo local. archivo. Luego se puede utilizar la ruta al archivo local en lugar de la URL. Aquí hay un ejemplo rápido:

# Create a folder for the TF hub module.
$ mkdir /tmp/moduleA
# Download the module, and uncompress it to the destination folder. You might want to do this manually.
$ curl -L "https://tfhub.dev/google/universal-sentence-encoder/2?tf-hub-format=compressed" | tar -zxvC /tmp/moduleA
# Test to make sure it works.
$ python
> import tensorflow_hub as hub
> hub.Module("/tmp/moduleA")

Ejecutar inferencia en un módulo preinicializado

Si está escribiendo un programa Python que aplica un módulo muchas veces a los datos de entrada, puede aplicar las siguientes recetas. (Nota: para atender solicitudes en servicios de producción, considere TensorFlow Serving u otras soluciones escalables sin Python).

Suponiendo que su modelo de caso de uso sea la inicialización y las solicitudes posteriores (por ejemplo, Django, Flask, servidor HTTP personalizado, etc.), puede configurar el servicio de la siguiente manera:

Modelos guardados de TF2

  • En la parte de inicialización:
    • Cargue el modelo TF2.0.
import tensorflow_hub as hub

embedding_fn = hub.load("https://tfhub.dev/google/universal-sentence-encoder/4")
  • En la parte de la solicitud:
    • Utilice la función de incrustación para ejecutar la inferencia.
embedding_fn(["Hello world"])

Esta llamada de una función tf.function está optimizada para el rendimiento; consulte la guía tf.function .

Módulos de concentrador TF1

  • En la parte de inicialización:
    • Construya el gráfico con un marcador de posición : punto de entrada al gráfico.
    • Inicialice la sesión.
import tensorflow as tf
import tensorflow_hub as hub

# Create graph and finalize (finalizing optional but recommended).
g = tf.Graph()
with g.as_default():
  # We will be feeding 1D tensors of text into the graph.
  text_input = tf.placeholder(dtype=tf.string, shape=[None])
  embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder/2")
  embedded_text = embed(text_input)
  init_op = tf.group([tf.global_variables_initializer(), tf.tables_initializer()])
g.finalize()

# Create session and initialize.
session = tf.Session(graph=g)
session.run(init_op)
  • En la parte de la solicitud:
    • Utilice la sesión para introducir datos en el gráfico a través del marcador de posición.
result = session.run(embedded_text, feed_dict={text_input: ["Hello world"]})

No se puede cambiar el tipo de modelo (por ejemplo, float32 a bfloat16)

Los SavedModels de TensorFlow (compartidos en TF Hub o de otro modo) contienen operaciones que funcionan en tipos de datos fijos (a menudo, float32 para los pesos y activaciones intermedias de redes neuronales). Estos no se pueden cambiar después del hecho al cargar SavedModel (pero los editores de modelos pueden optar por publicar diferentes modelos con diferentes tipos de datos).

Actualizar una versión de modelo

Los metadatos de la documentación de las versiones del modelo se pueden actualizar. Sin embargo, los activos de la versión (archivos modelo) son inmutables. Si desea cambiar los activos del modelo, puede publicar una versión más nueva del modelo. Es una buena práctica ampliar la documentación con un registro de cambios que describa los cambios entre versiones.