Бесконечный L oop с ImageDataGenerator - PullRequest
1 голос
/ 10 июля 2020

Я работаю с большим набором данных, и в результате мне приходится загружать данные в оперативную память пакетно для более быстрой работы без исчерпания ресурсов. Я использую Image Data Generator с .flow

Использование a for l oop приводит к бесконечному l oop, который постоянно генерирует изображения одного и того же размера пакета, прежде чем зацикливаться, чтобы начать снова. Код препаратора показан ниже:

train_dataset=tf.keras.preprocessing.image.ImageDataGenerator(featurewise_center=False, samplewise_center=False,
    featurewise_std_normalization=False, samplewise_std_normalization=False,
    zca_whitening=False, rotation_range=0, width_shift_range=0.0,
    height_shift_range=0.0, brightness_range=None, shear_range=0.0, zoom_range=0.0,
    channel_shift_range=0.0, cval=0.0, horizontal_flip=False,
    vertical_flip=False, preprocessing_function=None,
    data_format=None, validation_split=0.0, dtype=None)
train_dataset.fit(X)

За ним следует попытка l oop, как показано ниже:

for images, y_batch in train_dataset.flow(X, y, batch_size=batch_size):
          print(np.shape(images))

Код просто продолжает возвращать массивы измерения:

(batch_size,img_size,img_size,3) (мне нужны эти изображения для переноса данных в мою оперативную память для выполнения обратной поддержки). Обратите внимание, что я не использую ничего вроде model.fit, и мне нужно запускать эти массивы с помощью моего правильного кода.

Не слишком уверен, как добавить условие остановки

1 Ответ

1 голос
/ 10 июля 2020

В том-то и дело; чтобы продолжать повторять вечно. model.fit_gerentaor() Keras или model.fit() tf.keras обрабатывают завершение обучения l oop в зависимости от параметров epochs и steps_per_epoch.

Если вы хотите вручную обучать модель, использующая ImageDataGenerator(), вы можете сделать примерно следующее:

epochs = 10
steps_per_epoch = len(x) // batch_size + 1  # we usually consider 1 epoch to be
                                            # the point where the model has seen
                                            # all the training samples at least once

generator = train_dataset.flow(X, y, batch_size=batch_size)

for e in range(epochs):
    for i, (images, y_batch) in enumerate(generator):
       model.train_on_batch(images, y_batch)  # train model for a single iteration
       if i >= steps_per_epoch:  # manually detect the end of the epoch
           break  
    generator.on_epoch_end()  # this shuffles the data at the end of each epoch
...