ValueError:所有输入数组必须具有相同的形状(机器学习)

时间:2018-10-17 19:34:09

标签: python numpy tensorflow machine-learning numpy-ndarray

我在其中一项机器学习作业中遇到问题。我们被要求使用机器学习来估计给定图像的个人年龄。我们获得了28360个火车图像和7090个测试图像的数据集。

我遇到的问题是我的代码段#3中的内容,HERE :) 特别是,我得到ValueError: all input arrays must have the same shape。就像我上面提到的那样,我的火车数据集的大小为28360。运行程序后,从temp.append(img)print(len(temp)),我可以再次找到28360。也许我没有一个全面的了解np.stack(temp)到底在做什么或如何工作,但是我的初始数组和最终数组的大小似乎相同,所以为什么会出现此问题。

问了一遍,并被告知问题不一定与我的temp列表的长度有关,而是我可能遇到的图像大小与其他图像大小不同。所包含的一个或多个调整大小的图像(数组)具有不同的形状,可能是因为调整大小失败或图像丢失或其他原因。如果是这样的话,如何在28360张图像的数据集中找出哪些不同?为什么要修复或丢弃它们?这真的是问题,还是其他问题??

任何人,请帮助。我究竟做错了什么?任何意见/建议将不胜感激。先感谢您。干杯,美好的一天。 :D

1 个答案:

答案 0 :(得分:0)

您知道问题所在,有些图像令人痛苦,我想您必须进行调试。尝试每次执行np.stack()并找出错误所在。当堆栈不再起作用时,将打印所有图像的形状,这可能使您知道出了什么问题。由于无法复制,因此无济于事。 np.stack将所有图像串联在一起,因此每个image.shape必须相同。

for image_name in train.Id:
    img_path = os.path.join(data_dir, 'train', img_name)
    img = imageio.imread(img_path)
    img = skimage.transform.resize(img, (32, 32), mode='constant')
    img = img.astype('float32') # this will help us in later stage
    temp.append(img)
    try:
        train_x = np.stack(temp)
    except ValueError:
        [print(im.shape) for im in temp]
        break

要使您对np.stack有更好的感觉,请考虑以下代码:

tmp = [np.zeros((400,400,3)), np.zeros((400,400,3))]
print(np.stack(tmp).shape)
>>> (2, 400, 400, 3)

tmp = [np.zeros((400,400,3)), np.zeros((400,400))]
print(np.stack(tmp).shape)
>>> ValueError: all input arrays must have the same shape

在第一个示例中,我有一个列表,其中包含两个形状完全相同的3D数组。 Numpy将它们堆叠在一起并创建一个新尺寸,通常称为批处理大小。在第二个数组中,我在列表中有一个3D和2D数组,当您尝试堆叠两个形状不同的数组(400、400、3)与(400、400)时,您将得到提到的ValueError。

我也很放心地看了here上的skimage文档。
在返回处,您可以看到以下内容:

  

img_array:ndarray   在第三维中存储了不同的色带/通道,因此,灰度图像为MxN,RGB图像MxNx3和RGBA图像MxNx4。

我觉得您的某些图像被读取为MxNx4阵列而不是MxNx3

希望我有所帮助,随时问我更多。

编辑

for image_name in train.Id:
    img_path = os.path.join(data_dir, 'train', img_name)
    img = imageio.imread(img_path)
    img = skimage.transform.resize(img, (32, 32), mode='constant')
    img = img.astype('float32') # this will help us in later stage
    if len(img.shape) == 3 and img.shape[-1] == 3  # only append if 3D and last dimension is a 3, standing for RGB
        temp.append(img)
train_x = np.stack(temp)