Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ValueError:检查输入时出错:预期conv2d_1_输入有4个维度,但得到了具有形状的数组(8020,1)_Python_Numpy_Keras_Convolutional Neural Network - Fatal编程技术网

Python ValueError:检查输入时出错:预期conv2d_1_输入有4个维度,但得到了具有形状的数组(8020,1)

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) [

我正在尝试构建一个图像分类器,但我遇到了本文标题中提到的错误。下面是我正在处理的代码。如何将形状为(8020,)的numpy数组转换为函数fit()所需的形状?我试图打印输入形状:train\u img\u array.shape[1:],但它给出了一个空形状:()

编辑:----------------------------------------------------------- 根据Nassim的要求,在这篇文章中添加了更多细节:

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", )