Path: blob/master/site/es-419/tutorials/keras/save_and_load.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Guardar y cargar modelos
El progreso del modelo se puede guardar durante y después del entrenamiento. Esto significa que un modelo puede reanudarse donde quedó y, de este modo, evitar tiempos de entrenamiento prolongados. La posibilidad de guardar también implica que puede compartir su modelo y los demás pueden recrear su trabajo. A la hora de publicar modelos y técnicas de investigación, la mayoría de los profesionales del aprendizaje automático comparten lo siguiente:
el código para crear el modelo, y
los pesos entrenados, o parámetros, del modelo
Al compartir estos datos, se ayuda a los demás a comprender cómo funciona el modelo para que lo puedan probar por sí mismos con nuevos datos.
Precaución: Los modelos de TensorFlow están cifrados y es importante que tenga cuidado con los códigos que no sean confiables. Consulte Usar TensorFlow de forma segura para obtener más información.
Opciones
Existen distintas formas de guardar modelos de TensorFlow en función de la API que esté usando. Esta guía usa tf.keras, una API de alto nivel que se usa para desarrollar y entrenar modelos en TensorFlow. Se recomienda el nuevo formato de alto nivel de .keras
que se utiliza en este tutorial para guardar objetos de Keras, ya que ofrece un guardado sólido y eficiente basado en nombres que a menudo es más fácil de depurar que los formatos de bajo nivel o heredados. Para flujos de trabajo de guardado o serialización más avanzados, especialmente los que involucran objetos personalizados, consulte la guía Guardar y cargar modelos de Keras. Por otros enfoques, consulte la guía Usar el formato SavedModel.
Preparar
Instalaciones e importaciones
Instale e importe TensorFlow y las dependencias:
Obtener un conjunto de datos de ejemplo
Usaremos el conjunto de datos MNIST para demostrar cómo guardar y cargar los pesos. Para acelerar estas ejecuciones, use los primeros 1000 ejemplos:
Definir un modelo
Para comenzar, genere un modelo secuencial simple:
Guardar puntos de verificación durante el entrenamiento
Puede usar un modelo entrenado sin necesidad de volver a entrenarlo o reanudar un entrenamiento donde lo dejó, en caso de que se haya interrumpido el proceso de entrenamiento. La retrollamada tf.keras.callbacks.ModelCheckpoint
le permite guardar continuamente el modelo tanto durante el entrenamiento como al final.
Uso de la retrollamada de punto de verificación
Cree una retrollamada tf.keras.callbacks.ModelCheckpoint
que guarde los pesos solo durante el entrenamiento:
Esta acción crea una única colección de archivos de puntos de verificación de TensorFlow que se actualiza al final de cada época:
Siempre y cuando dos modelos compartan la misma arquitectura, podrá compartir los pesos entre ambos. Por lo tanto, al restaurar un modelo solo a partir de los pesos, cree un modelo con la misma arquitectura que el modelo original y, luego, configure sus pesos.
A continuación, vuelva a generar un modelo sin entrenar y evalúelo en el conjunto de prueba. Un modelo sin entrenar se ejecutará a niveles de azar (~10 % de precisión):
Luego, cargue los pesos del punto de verificación y vuelva a evaluar:
Opciones de la retrollamada de punto de verificación
La retrollamada ofrece varias opciones para otorgar nombres únicos a los puntos de verificación y ajustar la frecuencia de creación de puntos de verificación.
Entrene un nuevo modelo y guarde puntos de verificación con nombres únicos cada cinco épocas:
Ahora, revise los puntos de verificación resultantes y elija el último:
Nota: El formato predeterminado de TensorFlow solo guarda los 5 puntos de verificación más recientes.
Para realizar la prueba, reestablezca el modelo y cargue el punto de verificación más reciente:
¿Qué archivos son estos?
El código que vimos anteriormente almacena los pesos en una colección de archivos con formato de punto de verificación que contienen solo los pesos entrenados en formato binario. Los puntos de verificación contienen lo siguiente:
Uno o más fragmentos que contienen los pesos de su modelo.
Un archivo de índice que indica qué pesos se almacenaron en un qué fragmento.
Si está entrenando un modelo en una sola máquina, tendrá un fragmento con el siguiente sufijo: .data-00000-of-00001
Guardar manualmente los pesos
Para guardar manualmente los pesos, use tf.keras.Model.save_weights
. De manera predeterminada, tf.keras
(y particularmente el método Model.save_weights
) usa el formato de punto de verificación de TensorFlow con una extensión .ckpt
. Para guardar en formato HDF5 con una extensión .h5
, consulte la guía Guardar y cargar modelos.
Guardar el modelo completo
Llame tf.keras.Model.save
para guardar la configuración de la arquitectura, los pesos y el entrenamiento de un modelo en un único archivo zip model.keras
.
Se puede guardar un modelo completo en tres formatos de archivo diferentes (el nuevo formato .keras
y dos formatos heredados: SavedModel
y HDF5
). Si guarda un modelo como path/to/model.keras
se guarda automáticamente en el formato más reciente.
Nota: Para los objetos de Keras se recomienda usar el formato .keras
de alto nivel, para guardar y recargar de forma más completa y basada en nombres, lo cual facilita la depuración. El formato SavedModel de bajo nivel y el formato H5 heredado aún son compatibles con el código existente.
Si desea cambiar al formato SavedModel, haga lo siguiente:
Pase
save_format='tf'
asave()
Pase un nombre de archivo sin extensión
Si desea cambiar al formato H5, haga lo siguiente:
Pase
save_format='h5'
asave()
Pase un nombre de archivo que termine en
.h5
Guardar un modelo completamente funcional es muy útil, puede cargarlo en TensorFlow.js (Saved Model, HDF5) y luego entrenarlo y ejecutarlo en navegadores web o convertirlo para ejecutarlo en dispositivos móviles mediante el uso de TensorFlow Lite (Saved Model, HDF5)
*Los objetos personalizados (por ejemplo, los modelos o las capas subclasificados) requieren atención especial a la hora de guardarlos y cargarlos. Consulte la sección Guardar objetos personalizados que se describe más abajo.
Nuevo formato .keras
de alto nivel
El nuevo formato de guardado Keras v3, que se marca con la extensión .keras
, es un formato más simple y eficiente que implementa un método de guardado basado en nombres, lo que le garantiza que lo que carga es exactamente lo que guardó, desde la perspectiva de Python. Esto simplifica mucho la tarea de depuración y constituye el formato recomendado para Keras.
La siguiente sección ilustra el método de guardado y restauración del modelo en el formato .keras
.
Vuelva a cargar un modelo Keras actualizado desde el archivo zip .keras
:
Intente ejecutar la evaluación y predecir con el modelo cargado:
Formato SavedModel
El formato SavedModel ofrece otra forma de serializar modelos. Los modelos guardados con este formato se pueden restaurar con tf.keras.models.load_model
y son compatibles con TensorFlow Serving. La guía SavedModel habla en detalle sobre cómo serve/inspect
el formato SavedModel. En la siguiente sección se ilustran los pasos para guardar y restaurar el modelo.
El formato SavedModel es un directorio que contiene un protobuf binario y un punto de verificación de TensorFlow. Inspeccione el directorio del modelo guardado:
Vuelva a cargar un modelo Keras actualizado desde el modelo guardado:
El modelo restaurado se compila con los mismos argumentos que el modelo original. Intente ejecutar la evaluación y con el modelo cargado:
Formato HDF5
Keras ofrece un formato de guardado de alto nivel heredado básico que usa el estándar HDF5.
Ahora bien, recree el modelo a partir de ese archivo:
Compruebe su precisión:
Keras guarda modelos mediante la inspección de sus arquitecturas. Esta técnica guarda todo:
Los valores de peso
La arquitectura del modelo
La configuración de entrenamiento del modelo (lo que le pasa al método
.compile()
)El optimizador y su estado, según corresponda (esto le permite reiniciar el entrenamiento donde lo dejó)
Keras no puede guardar los optimizadores v1.x
(desde tf.compat.v1.train
) ya que no son compatibles con los puntos de verificación. Para los optimizadores v1.x, debe volver a compilar el modelo después de la carga; con lo que se pierde el estado del optimizador.
Guardar objetos personalizados
Si está usando el formato SavedModel, puede omitir esta sección. La principal diferencia entre los formatos .keras
/HDF5 de alto nivel y el formato SavedModel de bajo nivel es que los formatos .keras
/HDF5 usan configuraciones de objetos para guardar la arquitectura del modelo, mientras que SavedModel guarda el gráfico de ejecución. Por lo tanto, los formatos SavedModel pueden guardar objetos personalizados como modelos subclasificados y capas personalizadas sin solicitar el código original. Sin embargo, como resultado, depurar SavedModels de bajo nivel puede ser una tarea más complicada, y recomendamos que use el formato .keras
de alto nivel en su lugar, ya que está basado en nombres y es nativo de Keras.
Para guardar objetos personalizados en .keras
y HDF5, debe hacer lo siguiente:
Defina un método
get_config
en su objeto y, si lo desea, un método de clasefrom_config
.get_config(self)
devuelve un diccionario serializable JSON de parámetros necesarios para recrear el objeto.from_config(cls, config)
usa la configuración que devuelveget_config
para crear un nuevo objeto. De forma predeterminada, esta función usará la configuración como kwargs de inicialización (return cls(**config)
).
Pase los objetos personalizados al modelo de una de las siguientes tres maneras:
Registre el objeto personalizado con el decorador
@tf.keras.utils.register_keras_serializable
. (opción recomendada)Pase el objeto directamente al argumento
custom_objects
cuando cargue el modelo. El argumento debe ser un diccionario que asigne el nombre de clase de la cadena a la clase de Python. Por ejemplo,tf.keras.models.load_model(path, custom_objects={'CustomLayer': CustomLayer})
Use
tf.keras.utils.custom_object_scope
con el objeto incluido en el argumento de diccionariocustom_objects
y coloque una llamadatf.keras.models.load_model(path)
dentro del ámbito.
Consulte el tutorial Escribir capas y modelos desde cero para ver ejemplos de objetos personalizados y get_config
.