pie*_*etz 6 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)])
Run Code Online (Sandbox Code Playgroud)
但那产生了
ValueError: could not broadcast input array from shape (32,32,3) into shape (1)
Run Code Online (Sandbox Code Playgroud)
我想我在滥用这个concatenate()功能,但我无法弄清楚我的失败.
小智 10
我有同样的问题并通过以下方式解决: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()
Run Code Online (Sandbox Code Playgroud)
小智 9
使用 ImageDataGenerator 时,数据以目录迭代器的格式加载。您可以批量或整体提取它
train_generator = train_datagen.flow_from_directory(
train_parent_dir,
target_size=(300, 300),
batch_size=32,
class_mode='categorical'
)
Run Code Online (Sandbox Code Playgroud)
其输出是
Found 3875 images belonging to 3 classes.
Run Code Online (Sandbox Code Playgroud)
要作为整体提取 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)
Run Code Online (Sandbox Code Playgroud)
注意:在此代码之前建议使用train_generator.reset()
上面代码的输出是
(3875, 300, 300, 3)
(3875, 3)
Run Code Online (Sandbox Code Playgroud)
输出是作为 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)
Run Code Online (Sandbox Code Playgroud)
代码的输出是
(122,)
(122,)
Run Code Online (Sandbox Code Playgroud)
希望这能作为一个解决方案