РЕШЕНО: каталог ImageDataGenerator.flow_from_directory не может выполнить однократное кодирование данных

#python #tensorflow #deep-learning

Вопрос:

Я использую ImageDataGenerator (версия tensorflow 2.5.0) для загрузки нескольких файлов jpg, которые я использую для системы классификации. Я уточнил class_mode='categorical' свое . Мои изображения изначально имеют цвет RGB, но даже несмотря на то, что я преобразую их в оттенки серого, я не думаю, что это должно иметь значение. Однако, когда я звоню train_set.classes , данные, которые я получаю,-это не однократно закодированные данные, а разреженные числовые данные. Вот мой ImageDataGenerator звонок:

 def preprocessing_function(image):
    neg = 1 - image
    return neg

#image_path = sys.argv[1]
image_path = ''

train_datagen = ImageDataGenerator(
    rescale=1./255,
    shear_range=0.2,
    zoom_range=0.2,
    vertical_flip=True,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True,
    preprocessing_function=preprocessing_function)

train_set = train_datagen.flow_from_directory(
    os.path.join(image_path, 'endo_jpg/endo_256_2021_08_05/Training'),
    target_size=(100,100),
    batch_size=batch,
    class_mode='categorical',
    color_mode='grayscale')
 

При вызове flow_from_directory метода мне возвращается то, что я ожидаю:

Найдено 625 изображений, относящихся к 4 классам.

Вызывая train_set.classes , я получаю длинный список целых чисел, а не одну горячую закодированную информацию:

массив([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3])

Я могу заставить данные быть одним горячим кодированием с помощью: train_set.classes = tensorflow.keras.utils.to_categorical(train_set.classes) , но тогда я не смогу тренироваться с генератором данных.

Я думаю , что есть проблема с моим указанием class_mode='categorical' , но я понятия не имею, почему. Я последовал примеру из документации (здесь), но вызов categorical возвращает разреженную метку. Я был бы признателен за любую помощь

Редактировать

Просто позвонив train_set[0] , я четко вижу изображения и надписи. Печатные этикетки-это одна горячая кодировка, основанная на моем коде. Я помечу вопрос как решенный.

Комментарии:

1. почему это проблема? вы не указываете цель, model.fit() вы просто даете генератор

2. Правильный способ пометить вопрос как решенный-это нажать на галочку рядом с ответом, который решает проблему. При желании вы можете опубликовать ответ ниже, а не редактировать свой вопрос вместе с решением.

3. Спасибо, что дали мне знать, я новичок в публикации о переполнении стека

Ответ №1:

Так как вы используете class_mode='categorical' , вам не нужно вручную преобразовывать метки в векторы с горячей кодировкой to_categorical() .

Генератор автоматически вернет метки как категориальные.

Комментарии:

1. Генератор возвращает мои метки как разреженные метки, но я хочу, чтобы он вернул одну горячую закодированную метку. В этом вся моя проблема

2. @DanielSherman это train_set.classes то, что возвращает ваши метки в виде целых чисел. Но когда используется генератор model.fit() , метки автоматически кодируются одним горячим кодом

Ответ №2:

Просто вызов train_set[0] четко показывает мне изображения и метки. Печатные этикетки-это одна горячая кодировка, основанная на моем коде. Я помечу вопрос как решенный.