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