keras - 用于非图像数据格式的多任务学习的 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) 大小的线性值。
解决方案
您可以尝试实现自定义生成器并完全关闭 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))
推荐阅读
- javascript - 执行某些js代码后,有没有办法从网站获取页面源?
- d3.js - 加载 csv 数据并将结果保存到变量
- python - 在 huggingface 的 pytorch-transformers 库中微调 GPT-2
- javascript - 如何检测给定路由的所有子组件都已在 Vue.js 中呈现?
- rxjs - 检索 Observable 订阅者并让他们订阅另一个 Observable
- machine-learning - RVL-CDIP 数据集
- apache - Mod rewrite - 即使常规文件存在,文件属性“-f”测试也会失败
- python - 如何编辑变量 Odoo
- thymeleaf - 百里香叶中第一个元素的附加属性
- postgresql - PostgreSQL Order BY 不同类型的数组