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