Ya sabes como implementar tus propios callbacks personalizados, ahora indagaremos en los callbacks inteligentes que TensorFlow ha creado para nosotros, uno de ellos es early stopping, una técnica que detendrá el entrenamiento si no mejora después de algunas iteraciones.
Antes de implementar esta funcionalidad, vamos a generalizar la creación del modelo mediante una función, de esta manera no tendremos que hardcodear cada modelo nuevo.
def get_model():
model = 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")
])
return model
Definiremos una instancia de modelo, la resumiremos y compilaremos.
model_early = get_model()
model_early.summary()
model_callback.compile(optimizer = "adam", loss = "categorical_crossentropy", metrics = ["accuracy"])
Crearemos nuestro callback de early stopping, para esto usaremos la respectiva clase de Keras que recibirá 3 parámetros: El monitor (que será la variable que vamos a monitorear o vigilar, en este caso será la pérdida), la paciencia (que será la tolerancia que tendrá el modelo antes de que pare, si en 3 épocas la pérdida no baja entonces se terminará el entrenamiento) y el modo (que determinará si buscamos la reducción o el aumento de la métrica, en este caso lo dejamos en detección automática).
callback_early = tf.keras.callbacks.EarlyStopping(monitor = "loss", patience = 3, mode = "auto")
Lo inyectamos al entrenamiento en la sección de callbacks y esperamos el entrenamiento.
history_early = model_early.fit(
train_generator,
epochs = 20,
callbacks = [callback_early],
validation_data = validation_generator
)