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