Path: blob/master/site/es-419/tutorials/distribute/save_and_load.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Guardar y cargar un modelo usando una estrategia de distribución
Visión general
En este tutorial se muestra el modo de guardar y cargar modelos en formato SavedModel con tf.distribute.Strategy
durante o después del entrenamiento. Hay dos tipos de API para guardar y cargar un modelo Keras: de alto nivel (tf.keras.Model.save
y tf.keras.models.load_model
) y de bajo nivel (tf.saved_model.save
y tf.saved_model.load
).
Para aprender sobre SavedModel y la serialización en general, lea la guía de modelo guardado, y la guía de serialización de modelo Keras. Empecemos con un ejemplo simple.
Advertencia: Los modelos TensorFlow son código y debe tener cuidado con el código que no sea de confianza. Aprenda más en Usar TensorFlow de forma segura.
Importar dependencias:
Cargue y prepare los datos con conjuntos de datos TensorFlow y tf.data
, y cree el modelo utilizando tf.distribute.MirroredStrategy
:
Entrene el modelo con tf.keras.Model.fit
:
Guardar y cargar el modelo
Ahora que tiene un modelo sencillo con el que trabajar, exploremos las API de guardado/carga. Hay dos tipos de API disponibles:
Alto nivel (Keras):
Model.save
ytf.keras.models.load_model
(formato de archivo zip.keras
)Bajo nivel:
tf.saved_model.save
ytf.saved_model.load
(formato TF SavedModel)
La API Keras
He aquí un ejemplo de cómo guardar y cargar un modelo con la API de Keras:
Restaure el modelo sin tf.distribute.Strategy
:
Una vez restaurado el modelo, puede seguir entrenando sobre él, incluso sin necesidad de volver a llamar a Model.compile
, puesto que ya estaba compilado antes de guardarlo. El modelo se guarda en formato de archivo zip de Keras, marcado con la extensión .keras
. Para más información, consulte la guía sobre guardado de Keras.
Ahora, restaure el modelo y entrénelo usando una tf.distribute.Strategy
:
Como muestra la salida Model.fit
, la carga funciona como se esperaba con tf.distribute.Strategy
. La estrategia usada aquí no tiene por qué ser la misma usada antes de guardar.
La API tf.saved_model
Guardar el modelo con la API de nivel inferior es parecido a hacerlo con la API de Keras:
Se puede cargar con tf.saved_model.load
. Sin embargo, dado que se trata de una API de nivel más bajo (y, por tanto, tiene una gama más amplia de casos de uso), no devuelve un modelo Keras. En su lugar, devuelve un objeto que contiene funciones que pueden usarse para hacer inferencias. Por ejemplo:
El objeto cargado puede contener varias funciones, cada una asociada a una clave. La clave "serving_default"
es la clave predeterminada para la función de inferencia con un modelo Keras guardado. Para realizar la inferencia con esta función:
También puede cargar y realizar inferencias de forma distribuida:
Llamar a la función restaurada es sólo un pase hacia adelante sobre el modelo guardado (tf.keras.Model.predict
). ¿Y si desea seguir entrenando la función cargada? ¿O qué pasa si necesita incrustar la función cargada en un modelo más grande? Una práctica común es empaquetar este objeto cargado en una capa Keras para conseguirlo. Por suerte, TF Hub dispone de hub.KerasLayer
con este fin, como se muestra aquí:
En el ejemplo anterior, hub.KerasLayer
de Tensorflow Hub envuelve el resultado cargado de nuevo desde tf.saved_model.load
en una capa Keras que se usa para construir otro modelo. Esto es muy útil para el aprendizaje por transferencia.
¿Qué API debiera usar?
Para guardar, si está trabajando con un modelo Keras, use el Keras Model.save
a menos que necesite el control adicional que permite la API de bajo nivel. Si lo que está guardando no es un modelo Keras, entonces la API de bajo nivel, tf.saved_model.save
, es su única opción.
Para cargar, su elección de API depende de lo que quiera recibir de la API de carga de modelos. Si no puede (o no quiere) recibir un modelo Keras, entonces use tf.saved_model.load
. De lo contrario, use tf.keras.models.load_model
. Tenga en cuenta que sólo puede recuperar un modelo Keras si ha guardado un modelo Keras.
Es posible combinar las API. Puede guardar un modelo Keras con Model.save
, y cargar un modelo que no sea Keras con la API de bajo nivel, tf.saved_model.load
.
Guardar/cargar desde un dispositivo local
Al guardar y cargar desde un dispositivo de E/S local mientras se entrena en dispositivos remotos (por ejemplo, al usar una TPU Cloud), debe usar la opción experimental_io_device
en tf.saved_model.SaveOptions
y tf.saved_model.LoadOptions
para fijar el dispositivo de E/S en localhost
. Por ejemplo:
Precauciones
Un caso especial es cuando se crean modelos Keras de determinadas formas y luego se guardan antes de entrenar. Por ejemplo:
Un SavedModel guarda los objetos tf.types.experimental.ConcreteFunction
generados al rastrear una tf.function
(consulte ¿Cuándo se rastrea una Función? en la guía Introducción a los grafos y tf.function para obtener más información). Si obtiene un ValueError
como este, es porque Model.save
no fue capaz de encontrar o crear una ConcreteFunction
rastreada.
Precaución: No debería guardar un modelo sin al menos una ConcreteFunction
, ya que, de lo contrario, la API de bajo nivel generará un SavedModel sin firmas ConcreteFunction
(aprenda más sobre el formato SavedModel). Por ejemplo:
Normalmente, la pasada hacia delante del modelo (el método call
) se rastrea automáticamente cuando se llama al modelo por primera vez, a menudo a través del método Model.fit
de Keras. Una ConcreteFunction
también puede ser generada por las API Sequential y Functional de Keras, si se configura la forma de entrada, por ejemplo, haciendo la primer capa ya sea un tf.keras.layers.InputLayer
u otro tipo de capa, y pasándole el argumento de palabra clave input_shape
.
Para verificar si su modelo tiene alguna ConcreteFunction
rastreada, compruebe si Model.save_spec
es None
:
Usemos tf.keras.Model.fit
para entrenar el modelo, y notemos que el save_spec
queda definido y el guardado del modelo funcionará: