将ImageDataGenerator结果分配给Numpy数组

时间:2017-02-16 21:21:18

标签: python arrays numpy keras

我使用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()功能,但我无法弄清楚我失败的地方。

2 个答案:

答案 0 :(得分:7)

我遇到了同样的问题并通过以下方式解决了这个问题: 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_generator = 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 :(得分: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数组(这意味着不能批量提取),可以使用此代码

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

希望这可以作为解决方案