我在其中一项机器学习作业中遇到问题。我们被要求使用机器学习来估计给定图像的个人年龄。我们获得了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
答案 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)