ImageDataGenerator:如何将第4维添加到numpy数组中?

时间:2019-04-24 16:35:28

标签: python numpy tensorflow keras deep-learning

我有以下代码,可使用opencv读取图像并显示它:

import cv2, matplotlib.pyplot as plt
img = cv2.imread('imgs_soccer/soccer_10.jpg',cv2.IMREAD_COLOR)
img = cv2.resize(img, (128, 128))
plt.imshow(img)
plt.show()

我想使用keras生成一些随机图像,所以我定义了这个生成器:

image_gen = ImageDataGenerator(rotation_range=15,
                           width_shift_range=0.1,
                           height_shift_range=0.1,
                           shear_range=0.01,
                           zoom_range=[0.9, 1.25],
                           horizontal_flip=True,
                           vertical_flip=False,
                           fill_mode='reflect',
                           data_format='channels_last',
                           brightness_range=[0.5, 1.5])

但是,当我以这种方式使用它时:

image_gen.flow(img)

我收到此错误:

'Input data in `NumpyArrayIterator` should have rank 4. You passed an array with shape', (128, 128, 3))

对我来说似乎很明显:RGB,图像,当然是3维! 我在这里想念什么? 该文档说,它需要一个4维数组,但没有指定我应该在第4维上放置什么

应该如何制作此4维数组?现在,我有(宽度,高度,通道),第4维在开始还是结束

我对numpy也不太熟悉:如何更改现有的img数组以添加第4维?

2 个答案:

答案 0 :(得分:3)

使用np.expand_dims()

import numpy as np
img = np.expand_dims(img, 0)
print(img.shape) # (1, 128, 128, 3)

第一个维度指定图片数量(在您的情况下为1张图片)。

答案 1 :(得分:1)

或者,您可以使用numpy.newaxisNone来将3D阵列提升为,如下所示:

img = img[np.newaxis, ...] 

# or use None
img = img[None, ...]

第一个维度通常是batch_size。只要您的张量适合GPU内存,当您要充分利用GPU等现代硬件时,就会为您提供很大的灵活性。例如,您可以通过沿第一维堆叠64张图像来传递64张图像。在这种情况下,您的4D数组将为(64, width, height, channels)