#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] четко показывает мне изображения и метки. Печатные этикетки-это одна горячая кодировка, основанная на моем коде. Я помечу вопрос как решенный.