Модель не обучается при использовании Keras ‘flow_from_directory’, но обучается нормально с ‘image_dataset_from_directory’?

Вопрос или проблема

При классификации изображений с использованием Keras я могу достичь точности валидации около 90-95%, однако я пытаюсь улучшить результат с помощью аугментации, поэтому перешел от image_dataset_from_directory к flow_from_directory, чтобы воспользоваться ImageDataGenerator.

По какой-то причине точность валидации остается на уровне 33% и не улучшается? Я изменил параметры аугментации, чтобы посмотреть, влияет ли это на обучение, но, похоже, это не так.

Может кто-то объяснить, делаю ли я что-то неправильно или есть ли альтернативный метод реализации аугментации?

оригинал:
(Найдено 240 файлов, относящихся к 3 классам.
Используется 192 файла для обучения.
Найдено 240 файлов, относящихся к 3 классам.
Используется 48 файлов для валидации.
Найдено 60 файлов, относящихся к 3 классам.)

train_data = tf.keras.preprocessing.image_dataset_from_directory(train_dir,
                                                                image_size=img_size,
                                                                batch_size=batch_no,
                                                                seed=seed_no,                                                               
                                                                shuffle=True,
                                                                subset="training",
                                                                validation_split=0.2,
                                                                label_mode="categorical")

validation_data = tf.keras.preprocessing.image_dataset_from_directory(train_dir,
                                                                      image_size=img_size,
                                                                      batch_size=batch_no,
                                                                      seed=seed_no,
                                                                      shuffle=False,
                                                                      validation_split=0.2,
                                                                      subset="validation",
                                                                      label_mode="categorical")

test_data = tf.keras.preprocessing.image_dataset_from_directory(test_dir,
                                                                image_size=img_size,
                                                                batch_size=batch_no,
                                                                shuffle=False,
                                                                seed=seed_no,
                                                                label_mode="categorical")

Заменено:
(Найдено 192 изображения, относящихся к 3 классам.
Найдено 48 изображений, относящихся к 3 классам.
Найдено 60 изображений, относящихся к 3 классам.)

dgen_test = ImageDataGenerator(rescale = 1./255.)
dgen_train = ImageDataGenerator(rescale = 1./255.,
                                zoom_range = 0.2,
                                horizontal_flip = True,
                                vertical_flip= True,
                                rotation_range=20,
                                shear_range=0.2,
                                validation_split=0.2
                                )

train_data = dgen_train.flow_from_directory(train_dir,
                                            subset="training",
                                            target_size=img_size,
                                            batch_size=batch_no,
                                            shuffle=True,
                                            seed=seed_no,
                                            class_mode="categorical")

validation_data = dgen_train.flow_from_directory(train_dir, 
                                                 subset="validation", 
                                                 target_size=img_size,
                                                 batch_size=batch_no, 
                                                 shuffle=False,
                                                 seed=seed_no,
                                                 class_mode="categorical")

test_data = dgen_test.flow_from_directory(test_dir, 
                                        target_size=img_size,
                                        batch_size=batch_no, 
                                        shuffle=False,
                                        seed=seed_no,
                                        class_mode="categorical")
```

Проблема решена с использованием tf.keras.layers и применением аугментации при построении модели.

https://www.tensorflow.org/tutorials/images/data_augmentation

ImageDataGenerator устарел.

Ответ или решение

Проблема, с которой вы столкнулись при использовании ImageDataGenerator с методом flow_from_directory, в отличие от image_dataset_from_directory, может быть связана с различными аспектами, которые влияют на процесс обучения вашей нейросети. Давайте подробно разберём возможные причины, а также предложим альтернативные решения, которые помогут улучшить вашу модель.

Потенциальные проблемы с использованием flow_from_directory и ImageDataGenerator

  1. Настройки аугментации:

    • При использовании ImageDataGenerator вы перечислили несколько параметров аугментации, таких как zoom_range, rotation_range и т.д. Важно отметить, что агрессивная аугментация может привести к искажению данных, что в свою очередь затруднит обучение модели.
    • Если аугментация вводит слишком много шума в данные, это может мешать модели учиться. Попробуйте снизить некоторые параметры аугментации или протестировать их по отдельности.
  2. Неправильное деление данных:

    • Когда вы использовали ImageDataGenerator, вы задали параметр validation_split. Убедитесь, что ваши данные корректно разделены на обучающую и валидационную выборки. Если валидационная выборка получена при помощи validation_split, а затем в процессе обучения используется слишком много или слишком мало данных, это может привести к искаженному результату.
    • Проверьте результаты, убедившись, что данные корректно распределены между обучающей и валидационной выборками.
  3. Проблемы с нормализацией данных:

    • Вы применяете rescale = 1./255., что является верным. Однако если модель обучается на неправильных данных, это может существенно повлиять на результаты. Убедитесь, что ваши данные нормализованы должным образом и что вы не засоряете путь к данным.
  4. Количество изображений в классе:

    • Убедитесь, что у вас достаточно данных для каждой из классов. Дисбаланс классов может привести к плохому обучению модели. Если в одном из классов значительно меньше образцов, это может вызвать проблемы при обучении.

Альтернативные методы аугментации

Если ваша цель состоит в том, чтобы улучшить обучение модели с помощью аугментации, вы можете рассмотреть недепрецированную функциональность Keras для аугментации изображений. Например, использование слоев аугментации в самой модели:

model = tf.keras.Sequential([
    tf.keras.layers.InputLayer(input_shape=(img_size[0], img_size[1], 3)),
    tf.keras.layers.RandomFlip("horizontal_and_vertical"),
    tf.keras.layers.RandomRotation(0.2),
    tf.keras.layers.Conv2D(32, (3, 3), activation='relu'),
    ...
])

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

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...