Как использовать функцию repeat () при построении данных в Keras?

Я обучаю бинарный классификатор на наборе данных о кошках и собаках:
Общий набор данных: 10000 изображений
Обучающий набор данных: 8000 изображений
Проверка / тестовый набор данных: 2000 изображений

Код записной книжки Jupyter:

# Part 2 - Fitting the CNN to the images
train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('dataset/training_set',
                                                 target_size = (64, 64),
                                                 batch_size = 32,
                                                 class_mode = 'binary')

test_set = test_datagen.flow_from_directory('dataset/test_set',
                                            target_size = (64, 64),
                                            batch_size = 32,
                                            class_mode = 'binary')

history = model.fit_generator(training_set,
                              steps_per_epoch=8000,
                              epochs=25,
                              validation_data=test_set,
                              validation_steps=2000)

Я без проблем обучил его на процессоре, но когда я запускаю на графическом процессоре, он выдает мне такую ​​ошибку:

Found 8000 images belonging to 2 classes.
Found 2000 images belonging to 2 classes.
WARNING:tensorflow:From <ipython-input-8-140743827a71>:23: Model.fit_generator (from tensorflow.python.keras.engine.training) is deprecated and will be removed in a future version.
Instructions for updating:
Please use Model.fit, which supports generators.
WARNING:tensorflow:sample_weight modes were coerced from
  ...
    to  
  ['...']
WARNING:tensorflow:sample_weight modes were coerced from
  ...
    to  
  ['...']
Train for 8000 steps, validate for 2000 steps
Epoch 1/25
 250/8000 [..............................] - ETA: 21:50 - loss: 7.6246 - accuracy: 0.5000
WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches (in this case, 200000 batches). You may need to use the repeat() function when building your dataset.
 250/8000 [..............................] - ETA: 21:52 - loss: 7.6246 - accuracy: 0.5000

Я хотел бы знать, как использовать функцию repeat () в keras с помощью Tensorflow 2.0?


person mayuresh_sa    schedule 03.03.2020    source источник
comment
вы можете показать результат print(type(training_set))?   -  person Frederik Bode    schedule 03.03.2020
comment
batch_size установлен на 32, а steps_per_epoch - 8K, что (я предполагаю) означает, что keras будет ожидать в общей сложности 8K * 32 сэмплов, которых у вас нет. Попробуйте установить steps_per_epoch = 8K / 32.   -  person Alex Kreimer    schedule 03.03.2020
comment
print (type (training_set)) показывает следующий результат: ‹class 'keras_preprocessing.image.directory_iterator.DirectoryIterator'›   -  person mayuresh_sa    schedule 03.03.2020
comment
@AlexKreimer Спасибо, я мог бы это сделать, но я хотел бы показать модели все мои обучающие изображения перед переходом к следующей эпохе, что интуитивно легко понять. Кроме того, я хотел знать, как использовать функцию repeat ()?   -  person mayuresh_sa    schedule 03.03.2020
comment
@mayuresh_sa steps_per_epoch измеряется партиями (stats.stackexchange.com/questions/153531/), поэтому в вашей модели будут рассмотрены все примеры за одну эпоху. repeat принадлежит (другому) миру tf.data (tensorflow.org/api_docs / python / tf / data / Dataset). Поскольку ваш код, похоже, не создает набор данных tf, я не понимаю, как он будет полезен в этом случае.   -  person Alex Kreimer    schedule 03.03.2020


Ответы (1)


Ваша проблема возникает из-за того, что параметры steps_per_epoch и validation_steps должны быть равны общему количеству точек данных, разделенных на batch_size.

Ваш код будет работать в Keras 1.X до августа 2017 года.

Измените свою model.fit функцию на:

history = model.fit_generator(training_set,
                              steps_per_epoch=int(8000/batch_size),
                              epochs=25,
                              validation_data=test_set,
                              validation_steps=int(2000/batch_size))

Начиная с TensorFlow2.1, fit_generator() устарел. Вы также можете использовать метод .fit() для генераторов.

TensorFlow ›= 2.1 код:

history = model.fit(training_set.repeat(),
                    steps_per_epoch=int(8000/batch_size),
                    epochs=25,
                    validation_data=test_set.repeat(),
                    validation_steps=int(2000/batch_size))

Обратите внимание, что int(8000/batch_size) эквивалентно 8000 // batch_size (целочисленное деление)

person Timbus Calin    schedule 03.03.2020
comment
@TimbusCalin В настоящее время я сталкиваюсь с той же проблемой, попробовал ответ, который вы дали, но проблема все еще сохраняется с той же ошибкой «На вашем вводе закончились данные». Можно ли использовать steps_per_epoch = int (training_set / batch_size)? - person User89; 06.05.2020
comment
Это другая проблема. Это потому, что вы используете tf.data.Dataset () и забыли поместить .repeat () в обучающий набор и в набор проверки, вот почему возникает ваша ошибка. - person Timbus Calin; 06.05.2020
comment
@TimbusCalin Я не использую tf.data.Dataset (), поэтому я нигде не помещал .repeat (). Я читал другие сообщения, и они рекомендовали использовать .repeat (), но никогда не упоминали, где это нужно делать. Следует ли это делать при создании итераций или при подгонке модели? Извините, что много спрашиваю, но этот вопрос ближе всего к тому, что я искал, и, как вы можете понять, я новичок в tenserflow. - person User89; 06.05.2020
comment
Вы можете поместить это так же, как указано выше, в training_set.repeat () - person Timbus Calin; 06.05.2020
comment
@TimbusCalin У меня та же проблема - на вашем вводе закончились данные. Это действительно может быть решено этим ответом. Однако мне интересно: почему этого не происходит, когда я тренируюсь на CPU, а только когда я тренируюсь на GPU (как указано в OP)? - person Matthias; 17.06.2020
comment
Вы также можете опустить параметр steps_per_epoch, и keras вычислит количество шагов из batch_size - person Amin; 05.01.2021
comment
@Amin Вы можете опустить его, если ваш DataGenerator является подклассом класса Sequence (), действительно, это необязательно для Sequence (), но не для других DataGeneratos. - person Timbus Calin; 05.01.2021