Obtención del histórico de los parámetros

Esta mejora deberá proporcionarnos los valores de todos los parámetros a lo largo del entrenamiento. Para almacenarlos necesitaremos dos estructuras independientes: una para los pesos (weights_history) y otra para los bias (bias_history). En todo caso, y debido a los requerimientos de memoria implicados, queremos también permitir que este registro pueda ser decidido por el usuario, para lo que añadiremos un nuevo parámetro al constructor de nuestra clase, parámetro al que llamaremos record_params_history y que tomará el valor False por defecto. Creamos estas variables en el constructor (que no se muestra completo a continuación):

def __init__(self, sizes, learning_rate = 0.01, batch_size = 16, epochs = 10,
            shuffle = True, validation_split = None, verbose = True,
            record_params_history = False):
    """ 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.__history = []                  # Exactitud del modelo tras cada epoch
    self.n_steps = 0                     # Número de actualizaciones de los parámetros
    self.record_params_history = record_params_history  # Controla el registro de parámetros
    self.weights_history = [self.weights]   # Valores de los pesos durante el entrenamiento
    self.bias_history = [self.biases]       # Valores de los bias durante el entrenamiento

Estas listas, weights_historybias_history, irán recibiendo los pesos y bias tras cada una de las actualizaciones y, como vemos en el código anterior, se inicializan con los parámetros aleatorios iniciales.

La adicción de las nuevas actualizaciones se realiza en el método __update_parameters:

def __update_parameters(self, mini_batch):
    """ Actualiza los parámetros de la red aplicando descenso de gradiente a un
    mini-batch """
    self.n_steps += 1
    ...
    if self.record_params_history:
        self.weights_history.append(self.weights)
        self.bias_history.append(self.biases)

Por supuesto, -al tratarse de parámetros- podremos acceder a ellos con el siguiente código:

model.weights_history
model.bias_history