Приложение: Пакетное обучение

Очень большие наборы данных могут не поместиться в память, выделенную вашему процессу. На предыдущих шагах мы настроили конвейер, в котором мы помещаем весь набор данных в память, подготавливаем данные и передаем рабочий набор в функцию обучения. Вместо этого Keras предоставляет альтернативную функцию обучения ( fit_generator ), которая извлекает данные пакетами. Это позволяет нам применять преобразования в конвейере данных только к небольшой (кратной batch_size ) части данных. В ходе наших экспериментов мы использовали пакетную обработку (код в GitHub) для таких наборов данных, как DBPedia , обзоры Amazon , Ag news и обзоры Yelp .

Следующий код показывает, как генерировать пакеты данных и передавать их в 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.