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.