值错误:无法将形状为(110,110,3)的输入数组广播到形状为(110,110)的数组。

3
我正在构建一个神经网络,尝试将彩色图像加载到网络中,但我一直遇到重塑错误。我将所有图像调整到最小尺寸(本例中为110 x 110),但当我尝试将X(每个图像像素的未压缩3D列表)转换为numpy数组以便称为xTrain时,使用以下代码行:
xTrain = np.array(X[:trainNum])
我会收到这个错误:"ValueError:无法将形状为(110,110,3)的输入数组广播到形状为(110,110)"。有人知道为什么会出现这种情况吗?我认为是因为我的数据,因为我的合作者复制了完全相同的代码与他自己的图像,转换为numpy数组成功,但我的却没有。 X标题的列表格式如下:
[array([[[137, 151, 199],
    [ 93, 114, 166],
    [116, 121, 164],
    ...,
    [124, 124, 175],
    [160, 162, 193],
    [154, 157, 177]],

   [[ 81,  94, 153],
    [106, 123, 184],
    [119, 124, 180],...

我该怎么修复这个问题?

2个回答

2

很可能,你的X列表包含了灰度图像和RGB图像的混合。


img_rgb = np.zeros((110, 110, 3))
img_gry = np.zeros((110, 110))

X_good = [img_rgb, img_rgb, img_rgb]
np.array(X_good[:])
# OK

X_bad = [img_rgb, img_gry, img_rgb]
np.array(X_bad[:])
# ValueError: could not broadcast input array from shape (110,110,3) into shape (110,110)

您可以将 X 中的灰度图像转换为 RGB:
def make_rgb(img):
    if len(img.shape) == 3:
        return img
    img3 = np.empty(img.shape + (3,))
    img3[:, :, :] = img[:, :, np.newaxis]
    return img3

X_repaired = [make_rgb(im) for im in X_bad]

np.array(X_repaired[:])
# No problem

1
由于Python无法将形状为(110,110,3)的数组转换为(110,110),因此在重塑时出现问题。数组形状中的3表示RGB或BGR颜色代码(在不同的图像读取函数之间变化)。此外,所有轴上的长度乘积应保持恒定。这意味着,例如,如果您的数组大小为(x1,y1,z1),并且您将其重塑为(x2,y2,z2),则x1y1z1 = x2y2z2,否则重塑函数将出错。
最简单的解决方法是将图像读取为灰度图像。在OpenCV中,实现如下:
import cv2 
  
# Using cv2.imread() method 
# Using 0 to read image in grayscale mode 
img = cv2.imread(path, 0) 
  
# Displaying the image 
cv2.imshow('image', img) 

#if your input image is not 110*110, you resize it
img = cv2.resize(img, (110,110))


有没有不需要将图像灰度化的解决方法? - Alexis Robles
你能分享一下你的神经网络架构吗?这样我就可以了解你想要实现什么。 - Dwij Mehta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接