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.
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.
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.
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.
Almacenamiento y carga de modelos: pesos y arquitectura
@adonaiVera, si no estoy mal esto solo te guardo tu ultima época, no? ósea la diferencia es que con esta metodología(la del curso) podemos guardar un modelo por cada época si así lo quisiéramos, pero en este caso tu reescribes el modelo en cada época. Me imagino que es por temas de espacio o algo similar.
Procedimiento:
Guardar la configuración o arquitectura del modelo en un diccionario
Cargar la arquitectura en un nuevo modelo (sin pesos)
Ir guardando los pesos actualizados en cada epoch
Definir directorio donde se guardan los pesos y que parámetros se guardarán
Hola, si quieren guardar la arquitectura de la red en un documento .json, pueden hacer lo siguiente
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()
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.
Muy buen aporte Daniel, no entendía porque no se salvaban todos los checkpoints hasta que vi que si, pero se sobre escribían los ficheros ya que tenían el mismo nombre.
¿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
Hola Felix David
Excelente pregunta, la clave principa es utilizar checkpoints durante el proceso de entrenamiento. Durante la instancia del checkpoint debes definir que metricas vas a tener en cuenta, y a su vez definir las rutas de almacenamiento, lo que te permitira ir almacenando los modelos en cada epochs. Tu mismo creas los criterios, si quieres almacenar unicamente los epochs en donde el accuracy de validación sea el mas alto puedes definir esa parametro.
Y a su vez un pequeño script para inicializar el checkpoint y en este caso almacena unicamente los pesos, teniendo en cuenta el accuracy de validación y buscando que sea lo maximo posible.
checkpoint_path ="training_1/cp.ckpt"checkpoint_dir = os.path.dirname(checkpoint_path)# Create a callback that saves the model's weights
cp_callback = tf.keras.callbacks.ModelCheckpoint( filepath=checkpoint_filepath, save_weights_only=True, monitor='val_accuracy', mode='max', save_best_only=True)# Train the model with the newcallbackmodel.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels), callbacks=[cp_callback]) # Pass callback to training
Revisalo y me cuentas que tal.
Saludos
Por si alguno no lo deja, les dejo con los parámetros, supongo que eso se actualizó y cambió
Keras introduced a clearer distinction between saving:
the whole model → model.save("model.keras") or model.save("model.h5")
just the weights → model.save_weights("model.weights.h5")
The suffix .weights.h5 helps avoid confusion (older versions allowed any filename, but this new convention is encouraged to clearly signal you’re only saving weights).
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?
La línea de código config_dict = hypermodel.get_config() solo guarda la arquitectura del modelo en memoria, no en el disco.
¿Por qué hypermodel da un accuracy y loss un poco más altos?
Hola Robert,
Cada vez que entrenas el modelo el accuracy y el loss cambia, debido a que el proceso en el cual la red neuronal encuentra sus pesos inicia de manera aleatoria; sin embargo el valor debe estar muy similar entre los dos casos.
Si tu ejecutas el codigo en tu pc, encontraras que tambien tienes un accuracy y loss un poco diferente.
saludos
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
una vez que un modelo ha sido entrenado y ha logrado un rendimiento satisfactorio, se puede guardar y reutilizar para predicciones o tareas de inferencia posteriores. Esto elimina la necesidad de volver a entrenar el modelo desde cero, ahorrando tiempo y recursos computacionales.
Compartir modelos
los modelos entrenados se pueden compartir con otros, lo que permite la colaboración y el intercambio de conocimientos y experiencia. Esto facilita la difusión de modelos eficaces para diversas aplicaciones.
Ajuste y experimentación
los modelos guardados sirven como punto de partida para realizar más ajustes o experimentación. Al cargar un modelo previamente entrenado, puede modificar su arquitectura, hiperparámetros o datos de entrenamiento para explorar diferentes escenarios y mejorar el rendimiento.
Implementación
los modelos entrenados se pueden implementar en entornos de producción para hacer predicciones o realizar tareas del mundo real. Guardar el modelo asegura su persistencia y permite integrarlo en aplicaciones o servicios.
También existe AutoKeras que automáticamente prueba con distintos modelos para encontrar el que mejores resultados ofrezca a partir de los datos: