如何处理ImageDataGenerator生成的数据?
how to process data generated by ImageDataGenerator?
我正在尝试使用 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]
在我的例子中,我如何处理 X1i[0] 和 X2i[0] 这两个系列,其中批量图像大小为 (224,224,3) 以具有大小为 (6,224,224) 的 X1Sum,而不是:
产量 [X1i[0], X2i[0]], X2i[1]
我会有:
yield X1Sum, X2i[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)
我想这就是你想要做的。
我正在尝试使用 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]
在我的例子中,我如何处理 X1i[0] 和 X2i[0] 这两个系列,其中批量图像大小为 (224,224,3) 以具有大小为 (6,224,224) 的 X1Sum,而不是: 产量 [X1i[0], X2i[0]], X2i[1] 我会有: yield X1Sum, X2i[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)
我想这就是你想要做的。