首页 > 解决方案 > 用于非图像数据格式的多任务学习的 keras 数据生成器

问题描述

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

标签: kerasdeep-learningneural-networkimage-segmentationsemantic-segmentation

解决方案


您可以尝试实现自定义生成器并完全关闭 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))

推荐阅读