Python ValueError:检查输入时出错:预期conv2d_1_输入有4个维度,但得到了具有形状的数组(8020,1)
我正在尝试构建一个图像分类器,但我遇到了本文标题中提到的错误。下面是我正在处理的代码。如何将形状为(8020,)的numpy数组转换为函数fit()所需的形状?我试图打印输入形状:train\u img\u array.shape[1:],但它给出了一个空形状:() 编辑:----------------------------------------------------------- 根据Nassim的要求,在这篇文章中添加了更多细节:Python ValueError:检查输入时出错:预期conv2d_1_输入有4个维度,但得到了具有形状的数组(8020,1),python,numpy,keras,convolutional-neural-network,Python,Numpy,Keras,Convolutional Neural Network,我正在尝试构建一个图像分类器,但我遇到了本文标题中提到的错误。下面是我正在处理的代码。如何将形状为(8020,)的numpy数组转换为函数fit()所需的形状?我试图打印输入形状:train\u img\u array.shape[1:],但它给出了一个空形状:() 编辑:----------------------------------------------------------- 根据Nassim的要求,在这篇文章中添加了更多细节: print(train_img_array) [
print(train_img_array)
[ array([[[255, 255, 255, 0],
[255, 255, 255, 0],
[255, 255, 255, 0],
...,
[255, 255, 255, 0],
[255, 255, 255, 0],
[255, 255, 255, 0]],
[[255, 255, 255, 0],
[255, 255, 255, 0],
[255, 255, 255, 0],
...,
...,
[255, 255, 255, 0],
[255, 255, 255, 0],
[255, 255, 255, 0]]], dtype=uint8)
array([[[255, 255, 255, 0],
[255, 255, 255, 0],
[255, 255, 255, 0],
...,
...,
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]], dtype=uint8)]
print(list(train_img_array))
[array([[[255, 255, 255, 0],
[255, 255, 255, 0],
[255, 255, 255, 0],
...,
[255, 255, 255, 0],
[255, 255, 255, 0],
[255, 255, 255, 0]],
[[255, 255, 255, 0],
[255, 255, 255, 0],
[255, 255, 255, 0],
...,
...,
[255, 255, 255, 0],
[255, 255, 255, 0],
[255, 255, 255, 0]]], dtype=uint8), array([[[255, 255, 255, 0],
[255, 255, 255, 0],
[255, 255, 255, 0],
...,
print(np.array(list(train_img_array)))
throws the error:
ValueError: could not broadcast input array from shape (700,584,4) into shape (700,584)
因此,使用结果进行调试后:
> print(type(train_img_array[0]))
<type 'numpy.ndarray'>
> print(train_img_array[0].shape)
(700, 584, 4)
> print(rain_img_array[0])
array([[[255, 255, 255, 0], [255, 255, 255, 0], [255, 255, 255, 0], ..., ..., [255, 255, 255, 0], [255, 255, 255, 0], [255, 255, 255, 0]]], dtype=uint8)
实际上是一个形状的numpy数组(8020),其中所有元素都是包含在图像中的其他numpy数组。基本上是两个嵌套的numpy数组
所以,您想要的是将嵌套数组的嵌套结构展平到单个数组对象中。我会这样做,它可能有点黑客,但应该工作,如下所示:
train_img_array =img_train['data'].values
train_img_array = np.array(list(train_img_array))
所以基本上把numpy数组的结构转换成一个numpy数组的列表。然后,当您从numpy数组列表中构建一个numpy数组时,您会得到一个(神奇的)多维度的numpy数组
此操作后的形状应为(8020700584,4)
现在,我看到了你可能会遇到的另一个潜在问题,那就是你的图像格式。图像的通道尺寸是最后一个(这里有4个通道)。然后,您应该在卷积层中指定:
conv2D(... , data_format="channels_last", )
此外,第一层的输入形状是(700584,4),而不是(256256,3)
希望它能起作用:-)你应该实际展示模型。不仅仅是调用
createModel()
。我没有包括该模型,因为我认为它不会对本次讨论产生影响。但我现在将包括它。根据keras
的规定,conv2d
层的输入必须是类型的四维:(样本、通道、行、列)
或(样本、行、列、列)
@Dav2357:谢谢Dav。。。但我的问题是如何将我的培训和验证数据转换成那个形状?你能打印(键入(train_img_数组[0])然后打印(train_img_数组[0].shape)然后打印(train_img_数组[0])吗?我试着按照你的建议将数组转换成numpy数组列表。但是我得到了这个错误:ValueError:无法将输入数组从shape(700584,4)广播到shape(700584)哪一行出现了这个错误?我需要更多信息:)我的错:)这行:train\u img\u array=np.array(list(train\u img\u array))你能做什么:打印(train\u img\u array)然后打印(list(train\u img\u array))然后打印(np.array(list(train\u img\u array))?应为3个输出sprint(训练img_数组[0])[[255 255 0][255 255 0][255 255 255 0]…,[255 255 255 0][255 255 255 255 0][255 255 255 255 0]]
train_img_array =img_train['data'].values
train_img_array = np.array(list(train_img_array))
conv2D(... , data_format="channels_last", )