مجموعه داده های بسیار بزرگ ممکن است در حافظه اختصاص داده شده به فرآیند شما مناسب نباشد. در مراحل قبلی، ما یک خط لوله راه اندازی کرده ایم که در آن کل مجموعه داده را به حافظه وارد می کنیم، داده ها را آماده می کنیم و مجموعه کاری را به تابع آموزشی ارسال می کنیم. در عوض، Keras یک تابع آموزشی جایگزین ( fit_generator
) ارائه میکند که دادهها را به صورت دستهای میکشد. این به ما اجازه میدهد که تبدیلهای موجود در خط لوله داده را فقط برای بخش کوچکی (مضربی از batch_size
) اعمال کنیم. در طول آزمایشهای خود، از دستهبندی (کد در GitHub) برای مجموعههای داده مانند DBPedia ، بررسیهای آمازون ، اخبار 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.