Realicemos un ejemplo concreto que sirva para visualizar el proceso. Supongamos que nuestro conjunto de entrenamiento es un sencillo array NumPy formado por 12 números enteros consecutivos comenzando por el cero, que el número de muestras n es, por lo tanto, 12, y que el tamaño del batch es 4:
training_data = np.arange(12)
n = len(training_data)
batch_size = 4
Si ejecutamos nuestro código (quitando los "self") el resultado es el siguiente:
mini_batches = [training_data[start:start + batch_size] for start in range(0, n, batch_size)]
mini_batches
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10, 11])]
Es decir, hemos dividido nuestro "dataset" en cuatro bloques de tres muestras cada uno.
Eso sí, si el número de muestras no es múltiplo exacto del tamaño del batch, el último bloque no tendrá el mismo tamaño que los demás. Por ejemplo, si seguimos trabajando con el mismo array pero el tamaño del batch es ahora 5:
training_data = np.arange(12)
n = len(training_data)
batch_size = 5
mini_batches = [training_data[start:start + batch_size] for start in range(0, n, batch_size)]
mini_batches
[array([0, 1, 2, 3, 4]), array([5, 6, 7, 8, 9]), array([10, 11])]
...vemos cómo el último bloque incluye solo dos muestras