keras val очень медленный при использовании model.fit_generator

Когда я использую свой набор данных для поворота базы на Resnet-50 в Keras(backend - тензорный поток), я нахожу очень странным, что после каждой эпохи val медленнее, чем train. Я не знаю почему, потому что моему графическому процессору не хватает памяти? Мой графический процессор K2200, который имеет 4 ГБ памяти. Я неправильно понимаю значение параграфов?

У меня 35946 поездов, поэтому я использую:

samples_per_epoch=35946,

У меня есть 8986 Вэл рис, поэтому я использую:

 nb_val_samples=8986,

Следующее является частью моего кода:

train_datagen = ImageDataGenerator(
    rescale=1./255,
    featurewise_center=False,  # set input mean to 0 over the dataset
    samplewise_center=False,  # set each sample mean to 0
    featurewise_std_normalization=False,  # divide inputs by std of the dataset
    samplewise_std_normalization=False,  # divide each input by its std
    zca_whitening=False,  # apply ZCA whitening
    rotation_range=20,  # randomly rotate images in the range (degrees, 0 to 180)
    width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
    height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)
    horizontal_flip=True,  # randomly flip images
    vertical_flip=False,
    zoom_range=0.1,
    channel_shift_range=0.,
    fill_mode='nearest',
    cval=0.,

)
test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    'data/train',
    batch_size=batch_size,
    class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
    'data/val',
    batch_size=batch_size,
    class_mode='categorical')
model.fit_generator(train_generator,
                    # steps_per_epoch=X_train.shape[0] // batch_size,
                    samples_per_epoch=35946,
                    epochs=epochs,
                    validation_data=validation_generator,
                    verbose=1,
                    nb_val_samples=8986,
                    callbacks=[earlyStopping,saveBestModel,tensorboard])

1 ответ

@Yanning Как вы уже упоминали в своем комментарии, первая эпоха идет медленно, потому что ImageDataGenerator читает данные с диска в RAM. Эта часть очень медленная. После того, как данные были считаны в ОЗУ, это просто вопрос чтения и передачи данных из ОЗУ в графический процессор.

Поэтому, если ваш набор данных невелик и может уместиться в вашей оперативной памяти, вы можете попытаться сделать из одного набора данных один кусочек файла и прочитать эти данные в начале. Это сэкономит много времени на поиск диска.

Пожалуйста, просмотрите этот пост, чтобы получить некоторое сравнение времени, затраченного на различные операции:

Число задержек, которые должен знать каждый программист

Номера сравнения латентности

Основная память эталонная 100 нс
Последовательное чтение 1 МБ из памяти 250000 нс 
Чтение 1 МБ последовательно с SSD         1 000 000 нс
Последовательное чтение 1 МБ с диска 20 000 000 нс

Думаю, ответ кроется в разнообразном выборе аргументов для функции fit_generator. У меня была такая же проблема, и я исправил ее, используя следующие аргументы в функции "fit_generator".

steps_per_epoch=training_samples_count // batch_size,
validation_steps=validation_samples_count // batch_size,

Обратите внимание, что я указал шаги как для проверки, так и для обучения, и это делает проверку быстрой.

Другие вопросы по тегам