Path: blob/master/site/es-419/guide/keras/save_and_serialize.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
Guardar y cargar modelos de Keras
Introducción
Un modelo de Keras consiste en múltiples componentes:
La arquitectura, o configuración, que especifica qué capas contiene el modelo y cómo están conectadas.
Un conjunto de valores de ponderaciones (el "estado del modelo").
Un optimizador (definido al compilar el modelo).
Un conjunto de pérdidas y métricas (definidas al compilar el modelo o llamar a
add_loss()
oadd_metric()
).
La API de Keras permite guardar todas estas piezas en el disco a la vez, o guardar solo algunas de ellas de forma selectiva:
Guardar todo en un único archivo en el formato TensorFlow SavedModel (o en el antiguo formato Keras H5). Esta es la práctica estándar.
Guardar solo la arquitectura / configuración, normalmente como un archivo JSON.
Guardar solo los valores de las ponderaciones. Esto se utiliza generalmente cuando se entrena el modelo.
Veamos cada una de estas opciones. ¿Cuándo utilizarías una u otra y cómo funcionan?
Cómo guardar y cargar un modelo
Si solo dispone de 10 segundos para leer esta guía, esto es lo que necesita saber.
Guardar un modelo de Keras:
Cargando el modelo de nuevo:
Ahora, veamos los detalles.
Preparación
Guardar y cargar modelos completos
Puede guardar un modelo completo en un solo artefacto. Esto incluirá:
La arquitectura/configuración del modelo
Los valores de ponderación del modelo (aprendidos durante el entrenamiento)
La información de compilación del modelo (si se llamó a
compile()
).El optimizador y su estado, según corresponda (esto le permite reiniciar el entrenamiento donde lo dejó)
APIs
model.save()
otf.keras.models.save_model()
tf.keras.models.load_model()
Hay dos formatos que puede utilizar para guardar un modelo completo en el disco: el formato SavedModel de TensorFlow, y el formato más antiguo de Keras H5. El formato recomendado es SavedModel. Es el predeterminado cuando se utiliza model.save()
.
Puede cambiar al formato H5:
Pasar
save_format='h5'
asave()
.Pasar un nombre de archivo que termine en
.h5
o.keras
asave()
.
Formato SavedModel
SavedModel es el formato de almacenamiento más completo que guarda la arquitectura del modelo, las ponderaciones y los subgrafos de Tensorflow rastreadas de las funciones de llamada. Esto permite que Keras restaure tanto las capas incorporadas como los objetos personalizados.
Ejemplo:
¿Qué contiene el SavedModel?
Al llamar a model.save('my_model')
se crea una carpeta llamada my_model
, que contiene lo siguiente:
La arquitectura del modelo y la configuración de entrenamiento (incluyendo el optimizador, las pérdidas y las métricas) se guardan en saved_model.pb
. Las ponderaciones se guardan en el directorio variables/
.
Para obtener información detallada sobre el formato SavedModel, consulte la guía SavedModel (El formato SavedModel en el disco).
Cómo administra SavedModel los objetos personalizados
Al guardar el modelo y sus capas, el formato SavedModel almacena el nombre de la clase, la función de llamada, las pérdidas y las ponderaciones (y la configuración, si está implementada). La función de llamada define el grafo de cálculo del modelo/ la capa.
En ausencia de la configuración del modelo/capa, la función de llamada se utiliza para crear un modelo que existe como el modelo original que puede ser entrenado, evaluado y utilizado para hacer inferencias.
No obstante, siempre es una práctica recomendable definir los métodos get_config
y from_config
al escribir un modelo personalizado o una clase de capa. Esto le permite actualizar fácilmente el cálculo más tarde si es necesario. Consulte la sección sobre Objetos personalizados para obtener más información.
Ejemplo:
El primer modelo cargado se hace mediante la clase config y CustomModel
. El segundo modelo se carga creando de forma dinámica la clase model que actúa como el modelo original.
Cómo configurar el SavedModel
Nuevo en TensoFlow 2.4 Se agregó el argumento save_traces
a model.save
, el cual permite activar el rastreo de funciones de SavedModel. Las funciones se guardan para permitir a Keras volver a cargar objetos personalizados sin las definiciones de clase originales, por lo que cuando save_traces=False
, todos los objetos personalizados deben tener métodos get_config
/from_config
definidos. Al cargar, los objetos personalizados deben pasarse al argumento custom_objects
. save_traces=False
reduce el espacio en disco utilizado por el SavedModel y el tiempo de ahorro.
Formato Keras H5
Keras también permite guardar un solo archivo HDF5 que contiene la arquitectura del modelo, los valores de las ponderaciones y la información compile()
. Es una alternativa ligera a SavedModel.
Ejemplo:
Limitaciones
En comparación con el formato SavedModel, hay dos cosas que no se incluyen en el archivo H5:
Las pérdidas y métricas externas agregadas mediante
model.add_loss()
&model.add_metric()
no se guardan (a diferencia de SavedModel). Si tiene dichas pérdidas y métricas en su modelo y desea reanudar el entrenamiento, deberá volver a agregarlas usted mismo después de cargar el modelo. Tenga en cuenta que esto no se aplica a las pérdidas/métricas creadas dentro de las capas medianteself.add_loss()
&self.add_metric()
. Mientras la capa esté cargada, estas pérdidas y métricas se mantienen, ya que forman parte del métodocall
de la capa.El grafo del cálculo de los objetos personalizados, como las capas personalizadas, no se incluye en el archivo guardado. En el momento de la carga, Keras necesitará acceder a las clases/funciones de Python de estos objetos para reconstruir el modelo. Ver Objetos personalizados.
Guardar la arquitectura
La configuración (o arquitectura) del modelo especifica qué capas contiene el modelo y cómo están conectadas estas capas*. Si tiene la configuración de un modelo, entonces el modelo se puede crear con un estado recién inicializado para las ponderaciones y sin información de compilación.
*Note que esto solo se aplica a modelos definidos usando las Apis functional o Sequential y no a modelos subclasificados.
Configuración de un modelo de la API Sequential o Functional
Este tipo de modelos son grafos explícitos de capas: su configuración siempre está disponible de forma estructurada.
APIs
get_config()
yfrom_config()
tf.keras.models.model_to_json()
ytf.keras.models.model_from_json()
get_config()
y from_config()
Llamar config = model.get_config()
devolverá un dict Python que contiene la configuración del modelo. El mismo modelo puede reconstruirse mediante Sequential.from_config(config)
(para un modelo Sequential
) o Model.from_config(config)
(para un modelo Functional de API).
El mismo flujo de trabajo también funciona para cualquier capa serializable.
Ejemplo de capa:
Ejemplo de modelo Sequential:
Ejemplo de modelo Functional:
to_json()
y tf.keras.models.model_from_json()
Esto es similar a get_config
/ from_config
, excepto que convierte el modelo en una cadena JSON, que luego se puede cargar sin la clase del modelo original. También es específico para los modelos, que no está hecho para las capas.
Ejemplo:
Objetos personalizados
Modelos y capas
La arquitectura de los modelos y capas subclase se definen en los métodos __init__
y call
. Se consideran bytecode de Python, que no se pueden serializar en una configuración compatible con JSON -- podría intentar serializar el bytecode (por ejemplo, mediante pickle
), pero es completamente inseguro y esto significaría que su modelo no se podría cargar en un sistema diferente.
Para guardar/cargar un modelo con capas definidas por el usuario, o un modelo de subclase, debe sobrescribir los métodos get_config
y de forma opcional from_config
. Además, debe registrar el objeto personalizado para que Keras sea consciente de ello.
Funciones personalizadas
Las funciones definidas por el usuario (por ejemplo, pérdida de activación o inicialización) no necesitan un método get_config
. El nombre de la función es suficiente para cargarla siempre que esté registrada como objeto personalizado.
Cargar solo el grafo de TensorFlow
Es posible cargar la gráfica de TensorFlow generada por Keras. Si lo hace, no necesitará proporcionar ningún custom_objects
. Puede hacerlo de la siguiente manera:
Tenga en cuenta que este método tiene varios inconvenientes:
Por razones de rastreabilidad, siempre debe tener acceso a los objetos personalizados que se utilizaron. No querrá poner en producción un modelo que no podrá volver a crear.
El objeto que devuelve
tf.saved_model.load
no es un modelo de Keras. Así que no es tan fácil de usar. Por ejemplo, no tendrá acceso a.predict()
o.fit()
.
Aunque se desaconseja su uso, puede ser útil si se encuentra en un aprieto, por ejemplo, si perdió el código de sus objetos personalizados o tiene problemas para cargar el modelo con tf.keras.models.load_model()
.
Puede encontrar más información en la página sobre tf.saved_model.load
Cómo definir los métodos de configuración
Especificaciones:
get_config
debería devolver un diccionario serializable en JSON para ser compatible con las APIs de ahorro de arquitectura y modelos de Keras.from_config(config)
(classmethod
) debe devolver una nueva capa u objeto del modelo que se crea a partir de la configuración. La implementación predeterminada devuelvecls(**config)
.
Ejemplo:
Registro del objeto personalizado
Keras mantiene una nota de qué clase generó la configuración. En el ejemplo anterior, tf.keras.layers.serialize
genera una forma serializada de la capa personalizada:
Keras mantiene una lista maestra de todas las clases incorporadas de capas, modelos, optimizadores y métricas, que se utiliza para encontrar la clase correcta para llamar a from_config
. Si no se puede encontrar la clase, se producirá un error (Value Error: Unknown layer
). Hay varias formas de registrar clases personalizadas en esta lista:
Establecer el argumento
custom_objects
en la función de carga. (consulte el ejemplo en la sección anterior "Definición de los métodos de configuración")tf.keras.utils.custom_object_scope
otf.keras.utils.CustomObjectScope
tf.keras.utils.register_keras_serializable
Ejemplo de función y capa personalizada
Clonación de modelos en la memoria
También se puede clonar un modelo en memoria mediante tf.keras.models.clone_model()
. Esto es equivalente a obtener la configuración y después recrear el modelo a partir de su configuración (por lo que no conserva la información de compilación ni los valores de las ponderaciones de las capas).
Ejemplo:
Cómo guardar y cargar solo los valores de las ponderaciones del modelo
Puede elegir guardar y cargar solo las ponderaciones de un modelo. Esto puede ser útil si:
Solo necesita el modelo para la inferencia: en este caso no necesitará reiniciar el entrenamiento, por lo que no necesita la información de compilación ni el estado del optimizador.
Está realizando aprendizaje por transferencia: en este caso estará entrenando un nuevo modelo reutilizando el estado de un modelo anterior, por lo que no necesita la información de compilación del modelo anterior.
API para transferencia de ponderación en la memoria
Las ponderaciones pueden copiarse entre diferentes objetos utilizando get_weights
y set_weights
:
tf.keras.layers.Layer.get_weights()
: Devuelve una lista de matrices numpy.tf.keras.layers.Layer.set_weights()
: Establece las ponderaciones del modelo con los valores del argumentoweights
.
A continuación, algunos ejemplos.
Transferencia de ponderaciones de una capa a otra, en la memoria
Transferencia de ponderaciones de un modelo a otro de arquitectura compatible, en la memoria
El caso de las capas sin estado
Como las capas sin estado no cambian el orden ni el número de ponderaciones, los modelos pueden tener arquitecturas compatibles aunque haya capas sin estado adicionales/faltantes.
API para guardar ponderaciones en el disco y volver a cargarlas
Las ponderaciones pueden guardarse en el disco llamando a model.save_weights
en los siguientes formatos:
Punto de verificación de TensorFlow
HDF5
El formato predeterminado para model.save_weights
es el punto de verificación de TensorFlow. Hay dos formas de especificar el formato de guardado:
save_format
argumento: Establezca el valor ensave_format="tf"
osave_format="h5"
.argumento
path
: Si la ruta termina con.h5
o.hdf5
, entonces se utiliza el formato HDF5. Otros sufijos resultarán en un punto de verificación de TensorFlow a menos quesave_format
esté configurado.
También está la opción de recuperar ponderaciones como matrices numpy en la memoria. Cada API tiene sus pros y sus contras que se detallan a continuación.
Formato de los puntos de verificación de TF
Ejemplo:
Detalles del formato
El formato del punto de verificación de TensorFlow guarda y restaura las ponderaciones usando nombres de atributos de objetos. Por ejemplo, considere la capa tf.keras.layers.Dense
. La capa contiene dos ponderaciones: dense.kernel
y dense.bias
. Cuando la capa se guarda en el formato tf
, el punto de control resultante contiene las claves "kernel"
y "bias"
y sus correspondientes valores de ponderaciones. Para obtener más información, consulte "Mecánica de carga" en la guía del punto de verificación de TF.
Tenga en cuenta que el atributo/borde del grafo se nombra con el nombre utilizado en el objeto padre, no con el nombre de la variable. Considere CustomLayer
en el siguiente ejemplo. La variable CustomLayer.var
se guarda con "var"
como parte de la clave, no con "var_a"
.
Ejemplo de transferencia de aprendizaje
Básicamente, mientras dos modelos tengan la misma arquitectura, podrán compartir el mismo punto de control.
Ejemplo:
Generalmente se recomienda utilizar la misma API para construir modelos. Si cambia entre Sequential y Functional, o Functional y subclassed, etc., reconstruya siempre el modelo entrenado previamente y cargue las ponderaciones entrenadas previamente en ese modelo.
La siguiente pregunta es, ¿cómo se pueden guardar y cargar las ponderaciones en diferentes modelos si las arquitecturas de los modelos son bastante diferentes? La solución es utilizar tf.train.Checkpoint
para guardar y restaurar las capas/variables exactas.
Ejemplo:
Formato HDF5
El formato HDF5 contiene ponderaciones agrupadas por nombres de capa. Las ponderaciones son listas ordenadas por la concatenación de la lista de ponderaciones entrenables con la lista de ponderaciones no entrenables (igual que layer.weights
). Por lo tanto, un modelo puede utilizar un punto de control hdf5 si tiene las mismas capas y estados entrenables que se guardaron en el punto de control.
Ejemplo:
Tenga en cuenta que cambiar layer.trainable
puede dar como resultado una ordenación diferente de layer.weights
cuando el modelo contiene capas anidadas.
Ejemplo de transferencia de aprendizaje
Cuando se cargan las ponderaciones entrenadas previamente desde HDF5, se recomienda cargar las ponderaciones en el modelo de verificación original y, a continuación, extraer las ponderaciones/capas deseadas en un nuevo modelo.
Ejemplo: