首页 > 解决方案 > 使用 flow_from_directory 在 Keras 中进行多任务输出的 ImageDataGenerator

问题描述

我正在创建一个多任务 CNN 模型,我有两个不同的分类属性(一个有 10 个类,第二个有 5 个类),我的目录结构如下所示:

    -Train
       - image1.jpg
          ...
       - imageN.jpg
   
    -Test
       - image1.jpg
             ...
       - imageN.jpg

    -Vald
       - image1.jpg
          ...
       - imageN.jpg

trainlabel 是一个数据框,包含 Image、PFRType、FuelType 列

我正在尝试使用 flow_from_dataframe ,我的生成器是:

trainGen = ImageDataGenerator()
trainGenDf = trainGen.flow_from_dataframe(trainLabel,
                                         directory = '../MTLData/train/',
                                         x_col = "Image",y_col=["PFRType","FuelType"],
                                         class_mode='multi_ouput',
                                         target_size=(224,224),
                                         batch_size=32)

我得到的错误是:检查目标时出错:预期 PFR 的形状为 (10,) 但数组的形状为 (1,)

PFR 是一个子任务层,有 10 个类输出

这是模型图。 在此处输入图像描述

标签: tensorflowkeras

解决方案


您可以使用flow_from_dataframe. 您只需将包含标签的 csv 文件解析为 pandas 数据框,该数据框将文件名映射到相应的标签。

例如,如果数据框看起来像:

| image_path | label_task_a | label_task_b | subset |
|------------|--------------|--------------|--------|
| image1.jpg | foo          | bla          | Train  |
| ...        | ...          | ...          | ...    |
| imageN.jpg | baz          | whatever     | Vald   |

您可以为每个子集创建一个生成器:

train_generator_task_a = datagen.flow_from_dataframe(
  dataframe=df[df.subset == 'Train']],
  directory='data/Train',
  x_col='image_path',
  y_col=['label_task_a', 'label_task_b'], # outputs for both tasks.
  batch_size=32,
  seed=42,
  shuffle=True,
  class_mode='categorical')

编辑1:

关于您的错误:如果您设置class_mode='sparse',Keras 期望标签是整数标签的一维 numpy 数组。您是否尝试将其设置为class_mode='multi_output'?


推荐阅读