如何处理ImageDataGenerator生成的数据?

时间:2019-05-07 11:18:38

标签: keras deep-learning imagedata

我正在尝试使用Keras ImageDataGenerator训练带有大型立体声数据集的模型。

对于每个场景,我有两个rgb图像,我必须将它们分割并连接起来以具有6个单通道图像作为模型的输入(即此形状(6,224,224,1))。对于小型数据集,这很容易,因为我可以将两个子数据集上载到内存中,并将图像的串联处理为ndarray。但是使用ImageDataGenerator时,它是不一样的,因为我必须确保它从两个子数据集中提取相同的批次,并能够在将输入传递给我的模型之前进行处理。

受此post的启发,我尝试了以下代码:

input_imgen = ImageDataGenerator()

def generate_generator_multiple(generator,dir1, dir2, batch_size):
    genX1 = generator.flow_from_directory(directory=dir1,
                                          color_mode="rgb",
                                          batch_size=batch_size,
                                          class_mode="categorical",
                                          shuffle=False)



    genX2 = generator.flow_from_directory(directory=dir2,
                                          color_mode="rgb",
                                          batch_size=batch_size,
                                          class_mode="categorical",
                                          shuffle=False)
    while True:
            X1i = genX1.next()
            X2i = genX2.next()
            yield [X1i[0], X2i[0]], X2i[1]  

在我的情况下,如何处理具有大小为(224,224,3)的一批图像的两个系列X1i [0]和X2i [0],使其具有大小为(6,224,224)的X1Sum,而不是:     产生[X1i [0],X2i [0]],X2i [1] 我会有:     产生X1Sum,X2i [1]

1 个答案:

答案 0 :(得分:1)

在我看来,您可以简单地将列表转换为数组,然后使用np.concatenate合并频道,并使用np.swapaxes将频道放在最前面。输出示例代码:

import numpy as np

list_a = []
list_b = []

for i in range(5):
    list_a.append(np.random.rand(4, 4, 3))
    list_b.append(np.random.rand(4, 4, 3))

a = np.array(list_a)
b = np.array(list_b)
print(a.shape)
print(b.shape)
c = np.concatenate((a, b), axis=-1)
print(c.shape)
c = np.swapaxes(c, 0, -1)
print(c.shape)

输出为:

(5, 4, 4, 3)
(5, 4, 4, 3)
(5, 4, 4, 6)
(6, 4, 4, 5)

我想这就是你想要做的。