الملحق: تدريب مجمّع

قد لا تتلاءم مجموعات البيانات الكبيرة جدًا مع الذاكرة المخصّصة للعملية. في الخطوات السابقة، تم إعداد مسار التعلّم الذي نستخدمه في نقل مجموعة البيانات بالكامل إلى الذاكرة، وإعداد البيانات، وتمرير مجموعة العمل إلى وظيفة التدريب. بدلاً من ذلك، توفّر Keras وظيفة تدريب بديلة (fit_generator) تسحب البيانات على دفعات. يتيح لنا ذلك تطبيق الإحالات الناجحة في مسار البيانات على جزء صغير (من مضاعفات batch_size) من البيانات. خلال تجاربنا، استخدمنا التجميع (الرمز في GitHub) لمجموعات البيانات مثل DBPedia ومراجعات Amazon وأخبار Ag ومراجعات 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.