È possibile che set di dati molto grandi non rientrino nella memoria allocata al processo. Nella
passaggi precedenti, abbiamo creato una pipeline in cui includiamo l'intero set di dati
nella memoria, preparare i dati e passare il set di lavoro alla formazione
personalizzata. Keras fornisce invece una funzione di addestramento alternativa
(fit_generator
)
che estrae i dati in batch. Questo ci permette di applicare le trasformazioni
della pipeline di dati a una piccola parte (un multiplo di batch_size
) dei dati.
Durante i nostri esperimenti, abbiamo utilizzato la modalità batch (codice in GitHub) per set di dati come
DBPedia, Amazon reviews, Ag news e Yelp reviews.
Il seguente codice illustra come generare batch di dati e inserirli in
fit_generator
.
def _data_generator(x, y, num_features, batch_size): """Generates batches of vectorized texts for training/validation. # Arguments x: np.matrix, feature matrix. y: np.ndarray, labels. num_features: int, number of features. batch_size: int, number of samples per batch. # Returns Yields feature and label data in batches. """ num_samples = x.shape[0] num_batches = num_samples // batch_size if num_samples % batch_size: num_batches += 1 while 1: for i in range(num_batches): start_idx = i * batch_size end_idx = (i + 1) * batch_size if end_idx > num_samples: end_idx = num_samples x_batch = x[start_idx:end_idx] y_batch = y[start_idx:end_idx] yield x_batch, y_batch # Create training and validation generators. training_generator = _data_generator( x_train, train_labels, num_features, batch_size) validation_generator = _data_generator( x_val, val_labels, num_features, batch_size) # Get number of training steps. This indicated the number of steps it takes # to cover all samples in one epoch. steps_per_epoch = x_train.shape[0] // batch_size if x_train.shape[0] % batch_size: steps_per_epoch += 1 # Get number of validation steps. validation_steps = x_val.shape[0] // batch_size if x_val.shape[0] % batch_size: validation_steps += 1 # Train and validate model. history = model.fit_generator( generator=training_generator, steps_per_epoch=steps_per_epoch, validation_data=validation_generator, validation_steps=validation_steps, callbacks=callbacks, epochs=epochs, verbose=2) # Logs once per epoch.