Вопрос или проблема
Я загрузил набор данных MINC для классификации материалов, который состоит из 23 категорий. Однако меня интересует только подмножество категорий (например, [дерево, листвa, стекло, волосы])
Можно ли получить подмножество данных, используя tf.keras.preprocessing.image_dataset_from_directory
?
Я попробовал tf.keras.preprocessing.image_dataset_from_directory(folder_dir, label_mode="categorical", class_names=["wood", "foliage", "glass", "hair"])
, но получил эту ошибку Имена `class_names`, которые были переданы, не совпадают с именами подкаталогов целевого каталога.
Существует ли способ получить подмножество каталогов, не удаляя и не изменяя папки? Я знаю, что datagen.flow_from_directory
может это сделать, но keras говорит, что это устарело, и мне следует использовать image_dataset_from_directory
.
class_name
ожидает, что метки будут соответствовать директориям подклассов.
Пример: если у вас есть метки ['cat', 'dog']
, у вас должны быть подкаталоги cat и dog в вашем каталоге для обучения train_dir/cat
и train_dir/dog
Я думаю, что вы можете решить свою проблему, включив только интересующие вас классы в ваш каталог для обучения.
Ответ или решение
Как использовать image_dataset_from_directory
для получения подмножества подкаталогов
Вопрос о том, как работать с подмножеством категорий в вашем наборе данных, довольно актуален для многих специалистов в области машинного обучения и компьютерного зрения. В данном случае, для выборки только из некоторых классов (например, [дерево, листву, стекло и волосы]) из загруженного набора данных MINC, необходимо обратить внимание на несколько ключевых моментов.
Проблема
Вы столкнулись с ошибкой при использовании функции tf.keras.preprocessing.image_dataset_from_directory
, указывая параметр class_names
. Причина, по которой возникает ошибка, заключается в том, что названия классов в class_names
должны точно соответствовать именам подкаталогов в вашей целевой директории. Если в каталоге не существует подкаталогов с соответствующими именами, то библиотека не сможет создать датасет и вы получите ошибку.
Решение
Есть несколько подходов, которые помогут вам получить подмножество данных без удаления или изменения существующих подкаталогов:
-
Создание новой директории с необходимыми классами:
Вы можете создать новую директорию и скопировать в неё подкаталоги классов, которые вас интересуют. Например:
- Создайте новую папку, например,
dataset_subset
. - Скопируйте подкаталоги
wood
,foliage
,glass
, иhair
из исходного каталога вdataset_subset
. - Теперь вы сможете использовать
image_dataset_from_directory
без ошибок:train_dataset = tf.keras.preprocessing.image_dataset_from_directory( 'dataset_subset', label_mode='categorical' )
- Создайте новую папку, например,
-
Использование
tf.data.Dataset
для фильтрации данных:Если создание новой директории – не лучший вариант, вы можете воспользоваться возможностями
tf.data
. Вот как это можно сделать:import tensorflow as tf import os # Задаем путь к основному каталогу с данными folder_dir = 'path/to/MINC_dataset' class_names = ['wood', 'foliage', 'glass', 'hair'] # Используем tf.data.Dataset для создания основного набора данных dataset = tf.keras.preprocessing.image_dataset_from_directory( folder_dir, labels='inferred', label_mode='categorical' ) # Фильтрация по классам def filter_classes(images, labels): indices = tf.where(tf.isin(tf.argmax(labels, axis=-1), class_names)) return tf.gather(images, indices), tf.gather(labels, indices) filtered_dataset = dataset.map(filter_classes)
-
Использовать генератор данных:
Хотя
datagen.flow_from_directory
считается устаревшим, он все еще может быть эффективен для вашей задачи, если вы уже знакомы с ним. Он позволяет гибко работать с директориями и фильтрами. Однако имейте в виду, что переход к новейшим API является более предпочтительным выбором.
Заключение
Использование image_dataset_from_directory
для работы с подмножествами классов требует точного соответствия именам подкаталогов или использования дополнительных механизмов фильтрации. Первый способ подразумевает создание новой директории, что просто и эффективно. Второй способ позволяет сохранить оригинальную структуру данных, но требует больше усилий для реализации.
Если у вас возникают сложности, обратите внимание на официальную документацию TensorFlow, так как она предлагает множество полезных примеров и рекомендаций для работы с изображениями.
Следуя этим шагам, вы сможете успешно создать свой датасет для обучения модели, не беспокоясь о ненужной модификации вашего оригинального набора данных.