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

keras data generator for multi task learning with non image data format

我正在使用三个解码器处理多任务语义分割问题,因此,我需要提供三个输入和三个输出。此外,我的数据集不是图像格式(.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) 线性值的大小。

您可以尝试实现自定义生成器并完全关闭 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(或者只是 model.fit,因为 tensorflow2)

model.fit_generator(batch_generator(batchsize))