Alberto Beiz

Mis pruebas y experimentos.

Contacta sin miedo:

Guardando el modelo, los pesos y resultados con Keras

Al trabajar con Deep Learning es importante guardar los progresos constantemente. ¿Te imaginas estar entrenando un modelo una noche entera y perder todo lo conseguido?

Vamos a ver como ir guardando paso a paso todo lo que vayamos consiguiendo. Lo primero es repetir el post anterior.

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import adam

# Archivo donde voy creando funciones con código
# ya visto en posts anteriores
import utils
(x_train, y_train), (x_test, y_test) = utils.load_f_mnist_as_lists()
batch_size = 128
epochs = 5

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
history = model.fit(x_train, y_train,
                    batch_size=batch_size,
                    epochs=epochs,
                    verbose = 0,
                    validation_data=(x_test, y_test))

Guardar los pesos

# En este momento guardamos los pesos en un archivo
# de manera que podemos evitarnos tener que volver
# a entrenarlo
model.save_weights('weights.h5')
# Para recuperar los pesos
model.load_weights('weights.h5')
score = model.evaluate(x_test, y_test)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
10000/10000 [==============================] - 3s 281us/step
Test loss: 0.342224063873291
Test accuracy: 0.8778

Guardar el modelo

Aqui guardaremos toda la información del modelo. Arquitectura, pesos, configuración…

model.save('model.h5')

# Borramos el modelo
del model
# Cargamos el modelo del archivo
model = keras.models.load_model('model.h5')
# Comprobamos resultados
score = model.evaluate(x_test, y_test)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
10000/10000 [==============================] - 3s 296us/step
Test loss: 0.342224063873291
Test accuracy: 0.8778

Guardar las predicciones

Vamos a ver como almacenar los resultados de nuestro modelo

# Usamos el set de validación, en un caso real
# usaríamos datos nuevos y desconocidos
y_predict = model.predict(x_test)
# Una predicción es un array de 10 posiciones
# en cada una está la probabilidad de que
# la imagen pertenezca a esa clase
y_predict[0]
array([1.0483492e-05, 1.1379884e-07, 9.5778762e-07, 3.1832022e-07,
       2.6587736e-06, 3.1131534e-02, 1.9408099e-05, 2.5080491e-02,
       4.4351156e-05, 9.4370967e-01], dtype=float32)
# Para verlo mejor acotamos los valores
y_predict[0].clip(min=0.05, max=0.95)
array([0.05     , 0.05     , 0.05     , 0.05     , 0.05     , 0.05     ,
       0.05     , 0.05     , 0.05     , 0.9437097], dtype=float32)
# Utilidades para guardar arrays en disco
import bcolz
def save_array(fname, arr):
    c=bcolz.carray(arr, rootdir=fname, mode='w')
    c.flush()


def load_array(fname):
    return bcolz.open(fname)[:]
# Guardamos las predicciones
save_array('predicciones.dat', y_predict)
del y_predict
# Las cargamos para seguir trabajando
y_predict = load_array('predicciones.dat')
y_predict[0].clip(min=0.05, max=0.95)
array([0.05     , 0.05     , 0.05     , 0.05     , 0.05     , 0.05     ,
       0.05     , 0.05     , 0.05     , 0.9437097], dtype=float32)

Conclusion

Vamos teniendo más herramientas para que trabajar con Deep Learning sea más fácil. Es muy importante saber guardar y volver a utilizar el trabajo realizado para ahorrar tiempo y dinerito.

Fuentes