Inicialización de la semilla de números aleatorios

Si queremos que la red neuronal pueda ser inicializada de forma reproducible, podemos permitir la inicialización de la semilla de números aleatorios. Añadimos, por lo tanto, un nuevo parámetro al constructor de nuestra clase y, antes de la generación de los pesos y bias aleatorios, si se ha pasado este parámetro, se inicializa la semilla:

def __init__(self, sizes, learning_rate = 0.01, batch_size = 16, epochs = 10,
            shuffle = True, validation_split = None, verbose = True,
            record_params_history = False, seed = None):
    """ 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
    if seed:
        np.random.seed(seed)

    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
    ...