ImageDataGenerator flow_from_dataframe с 2 выходами (y_col)

#tensorflow #keras #conv-neural-network

Вопрос:

Я разрабатываю функциональную модель API, где:

  • Ввод: Изображение
  • Выход:
    1. цветовая классификация (50 возможностей)
    2. классификация форм (150 возможностей)

Я сталкиваюсь с проблемой, касающейся ImageDataGenerator.flow_from_dataframe передачи y_col аргумента как ["shape", "label"] . Я попытался использовать этот class_mode аргумент , как raw categorical и все остальные.

Когда я устанавливаю categorical , извлекается следующая ошибка:

Ошибка типа: Если class_mode=»категориальный», y_col=»[‘shape_std’, ‘label_std’]» значения столбцов должны быть строкой типа, списком или кортежем.

Код, в котором возникает проблема, показан ниже:

 # DataFrame Example:
                path  shape  label phase
     colorML19YI.jpg  15303   36   train  
     color4J3XI9.jpg  15303   36   train  
     colorMOYIAT.jpg  15303   36   train  
     colorJ6J6QR.jpg  15303   36   train  
     colorLGZ4OV.jpg  15303   36   train

self.batch_size = 32
self.phases = ['train', 'valid', 'test']
for i, phase in enumerate(self.phases):
            self.phase_gen.append(self.image_gen(df, phase, self.batch_size)

def image_gen(self, df, phase, batch_size):
    df_mod = df[df['phase']==phase]
    class_mode = 'categorical'
    y_col = ['shape', 'label', ['shape_std', 'label_std'], ["shape", "label"], ['shape_label2']]
    
    
    if phase == 'train':
        phase_iter = ImageDataGenerator(
                                        rotation_range=20,
                                        zoom_range=0.15,
                                        width_shift_range=0.2,
                                        height_shift_range=0.2,
                                        shear_range=0.15,
                                        horizontal_flip=True,
                                        fill_mode="nearest"
        ).flow_from_dataframe(
            dataframe=df_mod,
            directory=self.imgs_dir,
            x_col='path',
            y_col=y_col[2],
            batch_size=batch_size,
            seed=1,
            shuffle=True,
            class_mode=class_mode,

        )
    elif phase == 'test':

            phase_iter = ImageDataGenerator(
                                        rotation_range=20,
                                        zoom_range=0.15,
                                        width_shift_range=0.2,
                                        height_shift_range=0.2,
                                        shear_range=0.15,
                                        horizontal_flip=True,
                                        fill_mode="nearest"
        ).flow_from_dataframe(
            dataframe=df_mod,
            directory=self.imgs_dir,
            x_col='path',
            y_col=y_col[2],
            batch_size=batch_size,
            seed=1,
            shuffle=False,
            class_mode=None,

        )               

    else:
        phase_iter = ImageDataGenerator(#rescale=1.0/255.0
        ).flow_from_dataframe(
            dataframe=df_mod,
            directory=self.imgs_dir,
            x_col='path',
            y_col=y_col[2],
            batch_size=batch_size,
            seed=1,
            shuffle=True,
            class_mode=class_mode,

        )
    return phase_iter
 

Кто — нибудь может мне с этим помочь? Или у вас есть четкое представление о том, что может произойти, если это произойдет?

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

1. shape_std и label_std значения столбцов, похоже, имеют значение float32. Это правда?

2. Нет, когда я создаю фрейм данных, есть диалог str (df.astype(str)). Таким образом, все столбцы имеют тип «объект». Что странно, так это то, что, когда я всего лишь одна переменная в качестве «y_col», ImageDataGenerator.flow_from_dataframe работает хорошо.

3. вы прошли shape_std и label_std здесь => > y_col=y_col[2] . Но вы упомянули, что пытаетесь передать ["shape", "label"] в качестве целевого столбца. Ты что, собирался садиться y_col=y_col[3] ? Так ["shape", "label"] как это 4 — й элемент в y_col массиве. и, пожалуйста, добавьте df.info() выходные данные оператора, чтобы увидеть, сколько данных какого типа у вас есть.