Obtención de la exactitud tras cada epoch

Esta mejora deberá permitirnos obtener, con formato de lista, los valores de la exactitud del modelo tras cada epoch. Esta información la almacenaremos en forma de atributo privado e incluiremos un método para obtenerla. Comenzamos, por lo tanto, añadiendo el atributo a nuestro constructor:

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.validation_split = validation_split   # Porcentaje de muestras para validación
    self.verbose = verbose               # Controla si se muestra info del entrenamiento
    self.__history = []                  # Exactitud del modelo tras cada epoch

Esta lista deberá inicializarse al comienzo de cada entrenamiento:

def fit(self, X: pd.core.frame.DataFrame, y: pd.core.series.Series):
    """ Entrenamiento de la red neuronal"""
    self.__history = []

...e irá recibiendo los valores accuracy calculados tras cada epoch:

for epoch in range(self.epochs):
    if self.shuffle:
        np.random.shuffle(training_data)
    mini_batches = [training_data[start:start + self.batch_size]
                    for start in range(0, n, self.batch_size)]
    for mini_batch in mini_batches:
        self.__update_parameters(mini_batch)
    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)
        self.__history.append(accuracy)
        if self.verbose:
            print("Epoch {} complete. Accuracy: {:.4f}".format(epoch, accuracy))
    else:
        if self.verbose:
            print("Epoch {} complete".format(epoch))

Por último, creamos un método, get_history, que nos devuelva esta lista:

def get_history(self):
    return self.__history