【问题标题】:Assign ImageDataGenerator result to Numpy array将 ImageDataGenerator 结果分配给 Numpy 数组
【发布时间】:2026-02-24 21:25:03
【问题描述】:

我正在使用 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 数据,我必须对 y 数据再次使用 [1] 做同样的事情。然后我无法合并两个给定的(A,B,C,D)(A,E) 以塑造(A,B,C,D,E)

标签: python arrays numpy keras


【解决方案1】:

我遇到了同样的问题并通过以下方式解决了它: 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()

【讨论】:

  • 如何处理大数据集?如果我遵循您的方法,我的大型数据集内存不足。有什么想法吗?
  • 我认为唯一的解决方案是增加您的机器 RAM 或使用批量大小并对其进行迭代。
  • 如何以较小的批次遍历整个数据集?谢谢
【解决方案2】:

使用 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数组(也就是不作为一个batch),可以使用这段代码

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)

输出是作为一个 numpy 数组一起获得的,即使它是使用 ImageDataGenerator 作为 32 个批次加载的。

要批量获取输出,请使用以下代码

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,)

希望这是一个解决方案

【讨论】: