image_dataset_from_directory с использованием подмножества подкаталогов

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

Я загрузил набор данных 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 должны точно соответствовать именам подкаталогов в вашей целевой директории. Если в каталоге не существует подкаталогов с соответствующими именами, то библиотека не сможет создать датасет и вы получите ошибку.

Решение

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

  1. Создание новой директории с необходимыми классами:

    Вы можете создать новую директорию и скопировать в неё подкаталоги классов, которые вас интересуют. Например:

    1. Создайте новую папку, например, dataset_subset.
    2. Скопируйте подкаталоги wood, foliage, glass, и hair из исходного каталога в dataset_subset.
    3. Теперь вы сможете использовать image_dataset_from_directory без ошибок:
      train_dataset = tf.keras.preprocessing.image_dataset_from_directory(
      'dataset_subset',
      label_mode='categorical'
      )
  2. Использование 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)
  3. Использовать генератор данных:

    Хотя datagen.flow_from_directory считается устаревшим, он все еще может быть эффективен для вашей задачи, если вы уже знакомы с ним. Он позволяет гибко работать с директориями и фильтрами. Однако имейте в виду, что переход к новейшим API является более предпочтительным выбором.

Заключение

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

Если у вас возникают сложности, обратите внимание на официальную документацию TensorFlow, так как она предлагает множество полезных примеров и рекомендаций для работы с изображениями.

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

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

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