【问题标题】:ImageDataGenerator for multi task output in Keras using flow_from_directory使用 flow_from_directory 在 Keras 中进行多任务输出的 ImageDataGenerator
【发布时间】:2020-03-11 20:49:07
【问题描述】:

我正在创建一个多任务 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 个类

这是模型图。

【问题讨论】:

    标签: tensorflow keras


    【解决方案1】:

    您可以使用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'

    【讨论】:

    • 您好,谢谢您的回复。是的,我现在正在尝试使用 flow_from_dataframe。我正在尝试训练多任务 CNN。我已经更新了问题,请您再看一遍,因为我仍然有一些奇怪的错误。
    • 您好,我现在正在尝试使用 flow_from_dataframe,但仍然有错误。我现在已经更新了这个问题。能否请您再次检查问题。谢谢:)
    • 另外,我使用 class_mode 作为稀疏,因为分类 Ill 必须对标签进行一次热编码。因此,我选择稀疏。
    • 是的,我刚刚尝试将 class_mode 设置为多输出。现在的错误是:检查目标时出错:预期 PFR 的形状为 (10,),但得到的数组形状为 (1,) PFR 是具有 10 个输出的 va 子任务层我在问题 @ITiger 中添加了模型图
    • 如果你有 10 个输出,你的模型可能期望一个热编码向量作为目标?然后在创建数据框时使用 one-hot-encoding 并使用 class_mode="categorical"
    【解决方案2】:

    我使用自定义函数生成器,目前不支持随机播放!

    def get_data_generator(data, split ,batch_size=16):
            imagePath = ''
            df =''
    
            if split == 'train':
                imagePath = '../MTLData/train/'
                df = data[data.dir == 'train']
            elif split == 'test':
                imagePath = '../MTLData/test/'
                df = data[data.dir == 'test']
            elif split == 'vald':
                imagePath = '../MTLData/vald/'
                df = data[data.dir == 'vald']
    
            pfrID = len(data.PFRType.unique())
            ftID = len(data.FuelType.unique())
            images, pfrs,fts = [], [], []
            while True:
                for i in range(0,df.shape[0]):
                    r = df.iloc[i]
                    file, pfr, ft = r['Image'], r['PFRType'], r['FuelType']
                    im = Image.open(imagePath+file)
                    im = im.resize((224, 224))
                    im = np.array(im) / 255.0
                    images.append(im)
                    pfrs.append(to_categorical(pfr, pfrID))
                    fts.append(to_categorical(ft, ftID))
                    if len(images) >= batch_size:
                        yield np.array(images), [np.array(pfrs), np.array(fts)]
                        images, pfrs, fts = [], [], []
    

    【讨论】:

      猜你喜欢
      • 2017-09-05
      • 2018-03-05
      • 2018-11-02
      • 2018-08-20
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 2020-03-11
      相关资源
      最近更新 更多