Obtención del número de actualizaciones

Queremos también que el atributo .n_steps nos devuelva el número de actualizaciones de los parámetros. Para ello creamos el parámetro en el 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.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
    self.__history = []                  # Exactitud del modelo tras cada epoch
    self.n_steps = 0                     # Número de actualizaciones de los parámetros

...lo inicializamos a cero al comienzo del método .fit():

def fit(self, X: pd.core.frame.DataFrame, y: pd.core.series.Series):
    """ Entrenamiento de la red neuronal"""
    self.__history = []
    self.n_steps = 0
    if self.shuffle:                    # Desordenación del dataset
        data = pd.concat([X, y], axis = 1)
        data = data.sample(frac = 1)
        y = data.iloc[:, -1]
        X = data.iloc[:, :-1]

...y aumentamos su valor cada vez que actualizamos los parámetros 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
    total_gradient_weights = [np.zeros(w.shape) for w in self.weights]
    total_gradient_bias = [np.zeros(b.shape) for b in self.biases]

Como probaremos en breve, podremos acceder a este valor con el código

model.n_steps