用于非图像数据格式的多任务学习的 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 数据生成器的主要内容,如果未能解决你的问题,请参考以下文章