Epochs

Pero ya sabemos también que no será suficiente con pasar los datos de entrenamiento por la red una única vez: en general serán necesarias muchas iteraciones hasta que los parámetros de la red converjan (si es que lo hacen). Habíamos almacenado en el atributo epochs el número de veces que queríamos repetir el ciclo de entrenamiento, por lo que el código anterior habrá que repetirlo dicho número de veces. El código modificado quedaría, por lo tanto, de la siguiente forma:

n = len(training_data)
for epoch in range(self.epochs):
    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)

Lo primero que hacemos es almacenar en la variable n el número de muestras de nuestro dataset y, a continuación, repetimos durante self.epochs veces el proceso de generar los mini_batches y hacer pasar cada uno de ellos por la red para estimar el error y actualizar los parámetros, cosa que hacemos en un método que suponemos que existe y al que llamamos __update_parameters().

Obsérvese que, tal y como está ahora mismo el código, los mini-batches creados van a ser los mismos en cada iteración. Pondremos solución a esto más adelante.