Cuando entrenamos nuestros modelos requerimos de monitorear su desempeño durante el entrenamiento, esto nos dará tiempo de reacción para entender por qué rinden como rinden. En esta ocasión manejaremos callbacks personalizados para monitorear el desempeño de nuestra red en términos de precisión y pérdida.
Aplicando callbacks a nuestro modelo
Para esta ocasión crearemos un modelo llamado model_callbacks, virtualmente será idéntico al último modelo trabajado, pero cambiaremos levemente el comportamiento del entrenamiento cuando sea llamado.
```python
model_callback = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(75, (3,3), activation = "relu", input_shape = (28, 28, 1)),
tf.keras.layers.MaxPool2D((2,2)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(256, kernel_regularizer = regularizers.l2(1e-5), activation = "relu"),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(128, kernel_regularizer = regularizers.l2(1e-5), activation = "relu"),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(len(classes), activation = "softmax")
])
model_callback.summary()
model_callback.compile(optimizer = "adam", loss = "categorical_crossentropy", metrics = ["accuracy"])
```
Crearemos nuestro propio callback desde la clase Callback que nos ofrece Keras.
Podemos activar un callback en cualquier momento del ciclo de vida del modelo, para esta ocasión podemos elegir si activarlo al inicio de cada época, durante el entrenamiento o al final, para esta ocasión elegiremos el último caso.
Crearemos nuestra clase TrainingCallback que heredará de Callback, definiremos la función on_epoch_end que se activará cada que termine una época y recibirá como parámetros el objeto mismo, la época y los logs (que contendrán las métricas de la red).
Obtenemos la precisión de los logs y la comparamos, para esta ocasión determinaremos que el modelo se detenga si es mayor a 95% o 0.95, si es así, entonces daremos un pequeño mensaje pantalla y setearemos la variable self.model.stop_training en verdadero para detenerlo prematuramente.
```python
from tensorflow.keras.callbacks import Callback
class TrainingCallback(Callback):
def on_epoch_end(self, epoch, logs = {}):
if logs.get("accuracy") > 0.95:
print("Lo logramos, nuestro modelo llego a 95%, detenemos nuestro modelo")
self.model.stop_training = True
```
Para hacer efectivo este callback, creamos una instancia y lo inyectamos al momento de entrenar el modelo en el parámetro de callbacks, puedes notar que recibe una lista, por lo que puedes agregar cuantos quieras.
```python
callback = TrainingCallback()
history_callback = model_callback.fit(
train_generator,
epochs = 20,
callbacks = [callback],
validation_data = validation_generator
)
```
El entrenamiento empezará, y al cumplirse la condición el entrenamiento se detendrá prematuramente.
python
Epoch 3/20
215/215 [==============================] - ETA: 0s - loss: 0.1442 - accuracy: 0.9673Lo logramos, nuestro modelo llego a 95%, detenemos nuestro modelo
215/215 [==============================] - 46s 213ms/step - loss: 0.1442 - accuracy: 0.9673 - val_loss: 0.5947 - val_accuracy: 0.8428
Personalizando callbacks
Puedes personalizar tus propios callbacks que podrás usar en diferentes etapas (entrenamiento, testing y predicción), para este ejemplo mostraremos en pantalla un mensaje según el inicio de cada etapa del entrenamiento.
```python
from tensorflow.keras.callbacks import Callback
class TrainingCallback(Callback):
def on_train_begin(self, logs=None):
print('Starting training....')
def on_epoch_begin(self, epoch, logs=None):
print('Starting epoch {}'.format(epoch))
def on_train_batch_begin(self, batch, logs=None):
print('Training: Starting batch {}'.format(batch))
def on_train_batch_end(self, batch, logs=None):
print('Training: Finished batch {}'.format(batch))
def on_epoch_end(self, epoch, logs=None):
print('Finished epoch {}'.format(epoch))
def on_train_end(self, logs=None):
print('Finished training!')
```
En la sección de recursos puedes encontrar ejemplos para los casos de test y predicción, además de documentación al respecto.
Contribución creada por Sebastián Franco Gómez.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?