En la documentación de Tensorflow nos dan otra opcion para guardar modelos:
Guardar el Modelo
model.save('path_to_my_model.h5')
Recrea exactamente el mismo modelo solo desde el archivo
new_model = keras.models.load_model('path_to_my_model.h5')
Aunque logres entrenar la mejor arquitectura de todas y encontrar los mejores parámetros posibles, si cierras tu notebook, pierdes todo el progreso. Es de vitar importancia conocer cómo cargar y descargar nuestros modelos.
Los modelos tienen 3 componentes principales: La arquitectura (que define la cantidad de capas, neuronas y entradas de la red), los pesos (que son los valores que se entrenan a la red) y las etiquetas (estas se usan especialmente en transfer learning para dar contexto al modelo).
Indaguemos en el código sobre cómo cargar y descargar modelos.
Cargando y descargando arquitecturas sin pesos
Puedes usar la arquitectura de un modelo para basarte a la hora de entrenar otros modelos, esto no traerá los pesos, por lo que no será útil para realizar predicciones.
Con el método get_config de tus modelos puedes adquirir un JSON completo con la información de la arquitectura de tu red.
config_dict = hypermodel.get_config()
Para cargar un modelo con base en esta configuración basará con usar el método from_config de los modelos secuenciales de Keras enviando como parámetro el JSON de configuración.
model_same_config = tf.keras.Sequential.from_config(config_dict)
Si resumimos el nuevo modelo nos encontraremos con las mismas dimensiones que el original.
model_same_config.summary()
Descargando arquitecturas con pesos
Para guardar arquitecturas con pesos es necesario usar el callback de ModelCheckpoint que nos permitirá guardar en disco el modelo con sus pesos.
from tensorflow.keras.callbacks import ModelCheckpoint
Crearemos un modelo vacío que guardaremos después.
model_weight = get_model() model_weight.compile(optimizer = "adam", loss = "categorical_crossentropy", metrics = ["accuracy"])
Crearemos la configuración para nuestro callback. Definimos el path donde se guardará el modelo, cada cuando se guardará, si solo guardará los pesos y el output de texto a recibir.
checkpoint_path = "model_checkpoints/checkpoint" checkpoint_weight = ModelCheckpoint( filepath = checkpoint_path, frecuency = "epoch", save_weight_only = True, verbose = 1 )
Entrenaremos el modelo sin olvidar agregar el callback.
history_weight = model_weight.fit( train_generator, epochs = 20, callbacks = [checkpoint_weight], validation_data = validation_generator )
Con esto hemos guardado un historial entero de nuestro modelo, puedes revisarlo en el directorio model_checkpoints/checkpoint.
Si deseas guardar manualmente los pesos de tu red lo puedes haces con el método save indicando el directorio de salida. Esta manera únicamente guardará la última iteración, por lo que si por alguna razón la red sufrió un daño en esta etapa, no podrás revertirlo (a comparación del callback que guarda el historial entero).
model_weight.save("model_manual/my_model")
Cargando arquitectura con pesos
Crearemos un nuevo modelo hueco con la misma estructura que el original.
model_weights2 = get_model() model_weights2.compile(optimizer = "adam", loss = "categorical_crossentropy", metrics = ["accuracy"])
Para cargar el modelo desde disco nos basta con usar el método load_weights indicando la locación a cargar.
model_weights2.load_weights(checkpoint_path)
Si evaluamos el desempeño del modelo original y el cargado nos daremos cuenta que son literalmente el mismo, reafirmando que el proceso de carga fue correcto.
model_weights2.evaluate(test_generator) 57/57 [==============================] - 3s 41ms/step - loss: 0.9109 - accuracy: 0.8494 [0.9108972549438477, 0.8494144082069397] model_weight.evaluate(test_generator) 57/57 [==============================] - 2s 31ms/step - loss: 0.9109 - accuracy: 0.8494 [0.9108973145484924, 0.8494144082069397]
Ya conoces cómo cargar y descargar arquitecturas huecas o con pesos (en historial o de una sola época), ahora indagaremos sobre las mejores decisiones a la hora de cargar modelos.
Contribución creada por Sebastián Franco Gómez.
Aunque logres entrenar la mejor arquitectura de todas y encontrar los mejores parámetros posibles, si cierras tu notebook, pierdes todo el progreso. Es de vitar importancia conocer cómo cargar y descargar nuestros modelos.
Los modelos tienen 3 componentes principales: La arquitectura (que define la cantidad de capas, neuronas y entradas de la red), los pesos (que son los valores que se entrenan a la red) y las etiquetas (estas se usan especialmente en transfer learning para dar contexto al modelo).

Indaguemos en el código sobre cómo cargar y descargar modelos.
Puedes usar la arquitectura de un modelo para basarte a la hora de entrenar otros modelos, esto no traerá los pesos, por lo que no será útil para realizar predicciones.
Con el método get_config de tus modelos puedes adquirir un JSON completo con la información de la arquitectura de tu red.
config_dict = hypermodel.get_config()
Para cargar un modelo con base en esta configuración basará con usar el método from_config de los modelos secuenciales de Keras enviando como parámetro el JSON de configuración.
model_same_config = tf.keras.Sequential.from_config(config_dict)
Si resumimos el nuevo modelo nos encontraremos con las mismas dimensiones que el original.
model_same_config.summary()
Para guardar arquitecturas con pesos es necesario usar el callback de ModelCheckpoint que nos permitirá guardar en disco el modelo con sus pesos.
from tensorflow.keras.callbacks import ModelCheckpoint
Crearemos un modelo vacío que guardaremos después.
model_weight = get_model()
model_weight.compile(optimizer = "adam", loss = "categorical_crossentropy", metrics = ["accuracy"])
Crearemos la configuración para nuestro callback. Definimos el path donde se guardará el modelo, cada cuando se guardará, si solo guardará los pesos y el output de texto a recibir.
checkpoint_path = "model_checkpoints/checkpoint"
checkpoint_weight = ModelCheckpoint(
filepath = checkpoint_path,
frecuency = "epoch",
save_weight_only = True,
verbose = 1
)
Entrenaremos el modelo sin olvidar agregar el callback.
history_weight = model_weight.fit(
train_generator,
epochs = 20,
callbacks = [checkpoint_weight],
validation_data = validation_generator
)
Con esto hemos guardado un historial entero de nuestro modelo, puedes revisarlo en el directorio model_checkpoints/checkpoint.
Si deseas guardar manualmente los pesos de tu red lo puedes haces con el método save indicando el directorio de salida. Esta manera únicamente guardará la última iteración, por lo que si por alguna razón la red sufrió un daño en esta etapa, no podrás revertirlo (a comparación del callback que guarda el historial entero).
model_weight.save("model_manual/my_model")
Crearemos un nuevo modelo hueco con la misma estructura que el original.
model_weights2 = get_model()
model_weights2.compile(optimizer = "adam", loss = "categorical_crossentropy", metrics = ["accuracy"])
Para cargar el modelo desde disco nos basta con usar el método load_weights indicando la locación a cargar.
model_weights2.load_weights(checkpoint_path)
Si evaluamos el desempeño del modelo original y el cargado nos daremos cuenta que son literalmente el mismo, reafirmando que el proceso de carga fue correcto.
model_weights2.evaluate(test_generator)
57/57 [==============================] - 3s 41ms/step - loss: 0.9109 - accuracy: 0.8494
[0.9108972549438477, 0.8494144082069397]
model_weight.evaluate(test_generator)
57/57 [==============================] - 2s 31ms/step - loss: 0.9109 - accuracy: 0.8494
[0.9108973145484924, 0.8494144082069397]
Ya conoces cómo cargar y descargar arquitecturas huecas o con pesos (en historial o de una sola época), ahora indagaremos sobre las mejores decisiones a la hora de cargar modelos.
Contribución creada por Sebastián Franco Gómez.
En la documentación de Tensorflow nos dan otra opcion para guardar modelos:
model.save('path_to_my_model.h5')
new_model = keras.models.load_model('path_to_my_model.h5')
Procedimiento:
Hola, si quieren guardar la arquitectura de la red en un documento .json, pueden hacer lo siguiente
import json
with open(os.path.join(WORK_DIRECTORY,'hypermodel_architecture.json'), 'w') as fp:
json.dump(hypermodel_architecture, fp)
Siendo
os.path.join(WORK_DIRECTORY,'hypermodel_architecture.json')
el lugar donde quiero guardar mi .json e hypermodel_architecture, el diccionario que contiene mi arquitectura.
Si quieren cargar la arquitectura desde el archivo .json:
with open(os.path.join(WORK_DIRECTORY, 'hypermodel_architecture.json' )) as jsn:
structure = json.load(jsn)
structure, vuelve a ser un diccionario con la arquitectura de la red neuronal que pueden visualizar con:
# Creo un modelo con el diccionario
hypermodel = tf.keras.Sequential.from_config(config=structure)
# Veo el resumen de la arquitectura.
hypermodel.summary()
Para no sobre escribir los pesos.
checkpoint_path = os.path.join(WORK_DIRECTORY, 'checkpoints_{epoch:02d}-{val_accuracy:.4f}')
checkpoint_weights = ModelCheckpoint(
filepath = checkpoint_path,
frequency = 'epoch',
save_weights_only = True,
verbose = 1
)
Creo que es una buena práctica imprimirlos con val_accuracy, porque este es un buen indicador de qué tan buenos son los pesos que estamos guardando.
¿En el minuto 10:08 se menciona que puedes guardar los pesos de una interación en específica, la numero 7, como se hace eso? ¿Como elegir guardar los pesos de una epoca en especifico? Yo se que se puede guardar la mejor configuración pero eso es otra historia
Por si alguno no lo deja, les dejo con los parámetros, supongo que eso se actualizó y cambió
path_chcks = "model_check/checkpoints.weights.h5"
checkpoints_weights = weights_(filepath=path_chcks, save_freq='epoch', save_weights_only=True, verbose=1, )
Esta línea de código config_dict = hypermodel.get_config()solo guarda la arquitectura del modelo en memoria verdad? ¿o también la guarda en el disco? ¿En caso de que la guarde en el disco duro, en que path lo guarda?
¿Por qué hypermodel da un accuracy y loss un poco más altos?
alguien que me pueda explicar la celda 75? por qué tantas palabras _:c
En el ámbito del aprendizaje automático, particularmente cuando se trabaja con redes neuronales, la capacidad de guardar y cargar modelos entrenados es crucial para varios propósitos:
Reutilización de modelos entrenados
Compartir modelos
Ajuste y experimentación
Implementación