Control de los mensajes generados durante el entrenamiento

Para permitir controlar si durante el entrenamiento se van a generar o no mensajes, añadimos un nuevo parámetro a nuestra clase: verbose. Si toma el valor True (que podemos considerar el valor por defecto) se imprimirán los mensajes adecuados al final de cada epoch. El constructor será, por lo tanto, el siguiente:

def __init__(self, sizes, learning_rate = 0.01, batch_size = 16, epochs = 10, shuffle = True,
            validation_split = None, verbose = True):
    """ Constructor de la red neuronal """
    self.num_layers = len(sizes)         # Número total de capas de la red
    self.sizes = sizes                   # Lista conteniendo el número de neuronas por capa
    self.learning_rate = learning_rate   # Tasa de aprendizaje
    self.batch_size = batch_size         # Tamaño del batch
    self.epochs = epochs                 # Número de epochs durante los que entrenar la red
    self.weights = [np.random.randn(x, y) for (x, y) in zip(sizes[1:], sizes[:-1])]
    self.biases = [np.random.randn(n, 1) for n in sizes[1:]]
    self.shuffle = shuffle               # Si toma el valor True, se desordenará el dataset
    self.validation_split = validation_split   # Porcentaje de muestras para validación
    self.verbose = verbose               # Controla si se muestra info del entrenamiento

En el método que ejecuta el entrenamiento haremos uso de este atributo para mostrar o no la información correspondiente:

if self.validation_split:
    prediction = self.predict(x_test)
    accuracy = sum(int(p == y) for (p, y) in zip(prediction, y_test)) / len(x_test)
    if self.verbose:
        print("Epoch {} complete. Accuracy: {:.4f}".format(epoch, accuracy))
else:
    if self.verbose:
        print("Epoch {} complete".format(epoch))

Obsérvese que el cálculo de la exactitud del modelo se realiza de forma independiente al control de los mensajes (es decir, podemos pedir al algoritmo que calcule la exactitud del modelo al final de cada epoch aunque no se esté mostrando el resultado en pantalla). Esto se hace así para permitir almacenar la información relativa a la exactitud del entrenamiento y poder devolverla posteriormente.