用于非图像数据格式的多任务学习的 keras 数据生成器

Posted

技术标签:

【中文标题】用于非图像数据格式的多任务学习的 keras 数据生成器【英文标题】:keras data generator for multi task learning with non image data format 【发布时间】:2021-09-19 06:33:24 【问题描述】:

我正在处理一个包含三个解码器的多任务语义分割问题,因此,我需要提供三个输入和三个输出。此外,我的数据集不是图像格式(.jpg,...),而是 .mat 和 .npy 格式。我的标签具有 0、1、2 三个值(与我的灰度图像形状相同的地图)。考虑到这两个,我尝试使用 keras 生成器加载数据集,因为我的数据集非常大。以下是我根据生成器的 keras 文档尝试过的内容,但据我所知,该文档将数据假定为图像和单任务网络。如何调整我的代码,以便生成多个任务和多种数据格式(非图像)?

def batch_generator(X_gen,Y_gen, amp_gen, phase_gen):
        while true: 
            yield(X_gen.next(),Y_gen.next(), map1_gen.next(), map2_gen.next())

其中 map1_gen 和 map2_gen 应该是其他两个输入(地图)的生成器。

train_images_dir = ''
train_masks_dir = ''
train_map1_dir = ''
train_map2_dir = ''

val_images_dir = ''
val_masks_dir = ''
val_map1_dir = ''
val_map2_dir = ''

datagen = ImageDataGenerator()

train_images_generator = datagen.flow_from_directory(train_images_dir,target_size=(Img_Length,Img_Height),batch_size=batch_size,class_mode=None)
train_mask_generator = datagen.flow_from_directory(train_masks_dir,target_size=(Img_Length,Img_Height, num_classes),batch_size=1,class_mode='categorical')
train_map1_generator = datagen.flow_from_directory(train_map1_dir,target_size=(Img_Length,Img_Height),batch_size=batch_size,class_mode=None)
train_map2_generator = datagen.flow_from_directory(train_map2_dir,target_size=(Img_Length,Img_Height),batch_size=batch_size ,class_mode=None)


#val augumentation.
val_images_generator = datagen.flow_from_directory(val_images_dir,target_size=(Img_Length,Img_Height),batch_size=batch_size,class_mode=None)

val_masks_generator = datagen.flow_from_directory(val_masks_dir,target_size=(Img_Length,Img_Height, num_classes),batch_size=1,class_mode='categorical') 
val_map1_generator = datagen.flow_from_directory(val_map1_dir,target_size=(Img_Length,Img_Height),batch_size=batch_size,class_mode=None)
val_map2_generator = datagen.flow_from_directory(val_map2_dir,target_size=(Img_Length,Img_Height),batch_size=batch_size,class_mode=None)

model = ...

model.fit_generator(batch_generator(train_images_generator,train_mask_generator, train_map1_generator, train_map2_generator), validation_data=batch_generator(val_images_generator,val_masks_generator, val_map1_generator, val_map2_generator),callbacks=...)

每个解码器的输出应该是 (Img_Length,Img_Height) 具有三个标签 0,1,2 的分割图; map1 和 map2 分别输出 (Img_Length,Img_Height) 大小的线性值。

【问题讨论】:

【参考方案1】:

您可以尝试实现自定义生成器并完全关闭 ImageDataGenerator。例如

def batch_generator(batchsize):
    while True:
        inputs1 = []
        inputs2 = []
        inputs3 = []
        outputs1 = []
        outputs2 = []
        outputs3 = []
        for _ in batchsize:
            input1 = cv2.imread(img1) #or whatever
            inputs1.append(input1)
            inputs2.append(...)
            ...

        # you may have to convert the lists into numpy arrays

        yield([inputs1,inputs2,inputs3],[outputs1,outputs2,outputs3])

基本上,您直接生成所有输入和输出的列表,每个输入和输出都是一个批次。 但这意味着您必须手动读取它们,但考虑到您有一些非图像数据类型,我认为这是有道理的。 然后,您可以将此生成器传递给 model.fit_generator(或者从 tensorflow2 开始只传递给 model.fit)

model.fit_generator(batch_generator(batchsize))

【讨论】:

感谢您的回答。我会尝试这样的事情,看看它是否有效。什么输出1,输出2,...是?它们是基本事实吗?我的第一个任务是主要任务,有图像和基本事实。另外两个任务是辅助任务,我需要提供一些与图像形状相同的地图。 [outputs1,outputs2,outputs3] 是很好的输出。我猜你的情况可能是 [groundTrouthImgs,map1s,map2s]。它们中的每一个都是一个批次,因此您将拥有一个 groundTrouthImg 列表和两个地图列表 是有道理的。根据我的理解,我需要给出 batch_generator 中的目录路径,并且可能还需要索引更新,以将数据从一个索引读取到具有批量大小数据量的另一个索引。我想知道如何更新索引? 抱歉,我不太确定我是否理解您的问题。您必须手动循环数据并每次生成一个批次。所以你必须从你使用的 for 循环中使用你自己的索引。我希望这会有所帮助

以上是关于用于非图像数据格式的多任务学习的 keras 数据生成器的主要内容,如果未能解决你的问题,请参考以下文章

具有互斥任务的多任务学习?

Keras中具有二进制分类的多标签

如何在 keras 中进行深度学习中的多标签分类?

小白学习keras教程二基于CIFAR-10数据集训练简单的MLP分类模型

Keras 中的多分类预测不止一个?

基于Keras的多标签图像分类