Вопрос или проблема
При классификации изображений с использованием 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
-
Настройки аугментации:
- При использовании
ImageDataGenerator
вы перечислили несколько параметров аугментации, таких какzoom_range
,rotation_range
и т.д. Важно отметить, что агрессивная аугментация может привести к искажению данных, что в свою очередь затруднит обучение модели. - Если аугментация вводит слишком много шума в данные, это может мешать модели учиться. Попробуйте снизить некоторые параметры аугментации или протестировать их по отдельности.
- При использовании
-
Неправильное деление данных:
- Когда вы использовали
ImageDataGenerator
, вы задали параметрvalidation_split
. Убедитесь, что ваши данные корректно разделены на обучающую и валидационную выборки. Если валидационная выборка получена при помощиvalidation_split
, а затем в процессе обучения используется слишком много или слишком мало данных, это может привести к искаженному результату. - Проверьте результаты, убедившись, что данные корректно распределены между обучающей и валидационной выборками.
- Когда вы использовали
-
Проблемы с нормализацией данных:
- Вы применяете
rescale = 1./255.
, что является верным. Однако если модель обучается на неправильных данных, это может существенно повлиять на результаты. Убедитесь, что ваши данные нормализованы должным образом и что вы не засоряете путь к данным.
- Вы применяете
-
Количество изображений в классе:
- Убедитесь, что у вас достаточно данных для каждой из классов. Дисбаланс классов может привести к плохому обучению модели. Если в одном из классов значительно меньше образцов, это может вызвать проблемы при обучении.
Альтернативные методы аугментации
Если ваша цель состоит в том, чтобы улучшить обучение модели с помощью аугментации, вы можете рассмотреть недепрецированную функциональность 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
, имеет много аспектов, начиная от аугментации и заканчивая корректным делением данных и нормализацией. Используйте способы аугментации на уровне модели, чтобы минимизировать негативные эффекты, связанные с неправильными настройками.
Подводя итог, я рекомендую проверять настройки аугментации, удостовериться в корректности деления данных и, возможно, экспериментировать с аугментацией на уровне модели. Это не только улучшит результаты, но и приведёт к более стабильной и надежной модели.