将ImageDataGenerator的结果分配给Numpy数组

9

我正在使用Keras中的ImageDataGenerator读取图像目录。我想将结果保存在numpy数组中,以便进行进一步的操作并将其保存到磁盘中的一个文件。

flow_from_directory()返回一个迭代器,这就是为什么我尝试了以下方法:

itr = gen.flow_from_directory('data/train/', batch_size=1, target_size=(32,32))
imgs = np.concatenate([itr.next() for i in range(itr.nb_sample)])

但是那样会产生
ValueError: could not broadcast input array from shape (32,32,3) into shape (1)

我认为我在错误地使用concatenate()函数,但我无法确定我哪里出错了。


我通过在itr.next()后面添加[0]部分地解决了我的问题。但是这只给了我x数据,我还需要使用[1]再次进行相同的操作以获取y数据。然后我无法将两个给定的(A,B,C,D)(A,E)合并成形状为(A,B,C,D,E)的数据。 - pietz
2个回答

19
我曾经遇到过同样的问题,并用以下方法解决了它: itr.next返回两个numpy.ndarray对象,batch_x和batch_y是下一批图像:(来源:keras/preprocessing/image.py) 因此,你可以将flow_from_directory的batch_size设置为整个训练数据集的大小。
例如,我的整个训练集由1481张图片组成:
train_datagen = ImageDataGenerator(rescale=1. / 255)
itr = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=1481,
class_mode='categorical')

X, y = itr.next()

1
如何处理大型数据集?如果我按照您的方法处理,对于大型数据集,我的内存不够用。有什么建议吗? - Grigorios Kalliatakis
1
我认为唯一的解决方案是要么增加您机器的RAM,要么调整批量大小并对其进行迭代。 - Florian
你如何使用较小的批次迭代整个数据集?谢谢。 - Grigorios Kalliatakis

9

使用ImageDataGenerator时,数据以directoryiterator格式加载。可以将其作为批次或整体进行提取

train_generator = train_datagen.flow_from_directory(
    train_parent_dir,
    target_size=(300, 300),
    batch_size=32,
    class_mode='categorical'
)

其输出结果为

Found 3875 images belonging to 3 classes.

要将整个numpy数组作为一整块提取(而不是批量提取),可以使用以下代码

x=np.concatenate([train_generator.next()[0] for i in range(train_generator.__len__())])
y=np.concatenate([train_generator.next()[1] for i in range(train_generator.__len__())])
print(x.shape)
print(y.shape)

注意:在执行此代码之前,建议使用 train_generator.reset()

上述代码的输出结果为:

(3875, 300, 300, 3)
(3875, 3)

即使使用了ImageDataGenerator以32个为一批次加载,输出结果仍会作为一个numpy数组一起获得。

若要按批次获取输出结果,请使用以下代码:

x=[]
y=[]
train_generator.reset()
for i in range(train_generator.__len__()):
   a,b=train_generator.next()
   x.append(a)
   y.append(b)
x=np.array(x)
y=np.array(y)
print(x.shape)
print(y.shape)

代码的输出为:

(122,)
(122,)

希望这个能作为解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接