Exportar un modelo guardado

Esta página describe los detalles de exportar (guardar) un modelo de un programa TensorFlow al formato de modelo guardado de TensorFlow 2 . Este formato es la forma recomendada de compartir modelos previamente entrenados y piezas de modelos en TensorFlow Hub. Reemplaza el antiguo formato TF1 Hub y viene con un nuevo conjunto de API. Puede encontrar más información sobre la exportación de modelos en formato TF1 Hub en Exportación en formato TF1 Hub . Puede encontrar detalles sobre cómo comprimir el modelo guardado para compartirlo en TensorFlow Hub aquí .

Algunos kits de herramientas de creación de modelos ya brindan herramientas para hacer esto (por ejemplo, consulte a continuación TensorFlow Model Garden ).

Visión de conjunto

SavedModel es el formato de serialización estándar de TensorFlow para modelos entrenados o piezas de modelos. Almacena los pesos entrenados del modelo junto con las operaciones exactas de TensorFlow para realizar su cálculo. Se puede usar independientemente del código que lo creó. En particular, se puede reutilizar en diferentes API de creación de modelos de alto nivel como Keras, porque las operaciones de TensorFlow son su lenguaje básico común.

Salvando de Keras

A partir de TensorFlow 2, tf.keras.Model.save() y tf.keras.models.save_model() por defecto el formato de modelo guardado (no HDF5). Los modelos guardados resultantes que se pueden usar con hub.load() , hub.KerasLayer y adaptadores similares para otras API de alto nivel a medida que estén disponibles.

Para compartir un modelo de Keras completo, simplemente guárdelo con include_optimizer=False .

Para compartir una parte de un modelo de Keras, haga que la parte sea un modelo en sí mismo y luego guárdelo. Puede diseñar el código así desde el principio....

piece_to_share = tf.keras.Model(...)
full_model = tf.keras.Sequential([piece_to_share, ...])
full_model.fit(...)
piece_to_share.save(...)

...o recorte la pieza para compartirla después (si se alinea con las capas de su modelo completo):

full_model = tf.keras.Model(...)
sharing_input = full_model.get_layer(...).get_output_at(0)
sharing_output = full_model.get_layer(...).get_output_at(0)
piece_to_share = tf.keras.Model(sharing_input, sharing_output)
piece_to_share.save(..., include_optimizer=False)

TensorFlow Models en GitHub usa el enfoque anterior para BERT (consulte nlp/tools/export_tfhub_lib.py , tenga en cuenta la división entre core_model para exportar y el pretrainer para restaurar el punto de control) y el último enfoque para ResNet (consulte legacy/image_classification/tfhub_export. pi ).

Guardar desde TensorFlow de bajo nivel

Esto requiere una buena familiaridad con la Guía de modelos guardados de TensorFlow.

Si desea proporcionar algo más que una firma de publicación, debe implementar la interfaz Reusable SavedModel . Conceptualmente, esto parece

class MyMulModel(tf.train.Checkpoint):
  def __init__(self, v_init):
    super().__init__()
    self.v = tf.Variable(v_init)
    self.variables = [self.v]
    self.trainable_variables = [self.v]
    self.regularization_losses = [
        tf.function(input_signature=[])(lambda: 0.001 * self.v**2),
    ]

  @tf.function(input_signature=[tf.TensorSpec(shape=None, dtype=tf.float32)])
  def __call__(self, inputs):
    return tf.multiply(inputs, self.v)

tf.saved_model.save(MyMulModel(2.0), "/tmp/my_mul")

layer = hub.KerasLayer("/tmp/my_mul")
print(layer([10., 20.]))  # [20., 40.]
layer.trainable = True
print(layer.trainable_weights)  # [2.]
print(layer.losses)  # 0.004

Consejos para creadores de modelos guardados

Al crear un modelo guardado para compartir en TensorFlow Hub, piense con anticipación si sus consumidores deben ajustarlo y cómo, y brinde orientación en la documentación.

Guardar desde un modelo de Keras debería hacer que todos los mecanismos de ajuste fino funcionen (ahorrar pérdidas de regularización de peso, declarar variables entrenables, rastrear __call__ tanto para training=True como para training=False , etc.)

Elija una interfaz de modelo que funcione bien con el flujo de gradiente, por ejemplo, logits de salida en lugar de probabilidades softmax o predicciones top-k.

Si el modelo utiliza abandono, normalización por lotes o técnicas de entrenamiento similares que involucran hiperparámetros, configúrelos en valores que tengan sentido en muchos problemas de destino esperados y tamaños de lotes. (Al momento de escribir este artículo, guardar de Keras no facilita que los consumidores los ajusten).

Los regularizadores de peso en capas individuales se guardan (con sus coeficientes de fuerza de regularización), pero la regularización de peso desde dentro del optimizador (como tf.keras.optimizers.Ftrl.l1_regularization_strength=...) ) se pierde. Informe a los consumidores de su modelo guardado en consecuencia.

Jardín modelo TensorFlow

El repositorio de TensorFlow Model Garden contiene muchos ejemplos de creación de modelos guardados TF2 reutilizables para cargar en tfhub.dev .

Solicitudes de la comunidad

El equipo de TensorFlow Hub genera solo una pequeña fracción de los activos que están disponibles en tfhub.dev. Confiamos principalmente en investigadores de Google y Deepmind, instituciones de investigación corporativas y académicas y entusiastas de ML para producir modelos. Como resultado, no podemos garantizar que podamos cumplir con las solicitudes de la comunidad para activos específicos, y no podemos proporcionar estimaciones de tiempo para la disponibilidad de nuevos activos.

El hito de solicitudes de modelos comunitarios a continuación contiene solicitudes de la comunidad para recursos específicos, si usted o alguien que conoce está interesado en producir el recurso y compartirlo entfhub.dev, ¡agradecemos la presentación!