Python Tensorflow/Keras Conv2D层中的输入形状错误

Python Tensorflow/Keras Conv2D层中的输入形状错误,python,pandas,tensorflow,keras,conv-neural-network,Python,Pandas,Tensorflow,Keras,Conv Neural Network,我第一次用Keras建立了一个卷积神经网络,我遇到了一些问题。CNN的目的是检测490x640px灰度图像中的模式,我已将其转换为3D numpy阵列。my Pandas dataframe的图像数据列中的每个图像都具有形状(490640,1) 我的代码如下所示: from sklearn.model_selection import train_test_split import tensorflow as tf from tensorflow.keras import layers, mod

我第一次用Keras建立了一个卷积神经网络,我遇到了一些问题。CNN的目的是检测490x640px灰度图像中的模式,我已将其转换为3D numpy阵列。my Pandas dataframe的图像数据列中的每个图像都具有形状
(490640,1)

我的代码如下所示:

from sklearn.model_selection import train_test_split
import tensorflow as tf
from tensorflow.keras import layers, models

# Assigning values to split the dataset into training and test data.
X = data[0]
Y = data[1]

# Allocate 20% of the dataset to be used as test data
train_images, test_images, train_labels, test_labels = train_test_split(X, Y, test_size=0.2, random_state=10)

class_names = ['Neutral', 'Anger', 'Contempt', 'Disgust', 'Fear', 'Happy', 'Sadness', 'Surprise']

model = models.Sequential()
model.add(layers.Conv2D(490, (3, 3), activation="relu", input_shape=(490, 640, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(100, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(100, (3, 3), activation='relu'))
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 488, 638, 490)     4900      
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 244, 319, 490)     0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 242, 317, 100)     441100    
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 121, 158, 100)     0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 119, 156, 100)     90100     
=================================================================
Total params: 536,100
Trainable params: 536,100
Non-trainable params: 0
此时,我的模型的摘要如下所示:

from sklearn.model_selection import train_test_split
import tensorflow as tf
from tensorflow.keras import layers, models

# Assigning values to split the dataset into training and test data.
X = data[0]
Y = data[1]

# Allocate 20% of the dataset to be used as test data
train_images, test_images, train_labels, test_labels = train_test_split(X, Y, test_size=0.2, random_state=10)

class_names = ['Neutral', 'Anger', 'Contempt', 'Disgust', 'Fear', 'Happy', 'Sadness', 'Surprise']

model = models.Sequential()
model.add(layers.Conv2D(490, (3, 3), activation="relu", input_shape=(490, 640, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(100, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(100, (3, 3), activation='relu'))
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 488, 638, 490)     4900      
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 244, 319, 490)     0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 242, 317, 100)     441100    
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 121, 158, 100)     0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 119, 156, 100)     90100     
=================================================================
Total params: 536,100
Trainable params: 536,100
Non-trainable params: 0
然后我有以下几点:

model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(8, activation='softmax'))

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit(train_images, train_labels, epochs=10, 
                    validation_data=(test_images, test_labels))
问题是,当我尝试运行此操作时,会出现以下错误:

ValueError:检查输入时出错:预期conv2d\u 1\u输入有4个维度,但得到了形状为(261,1)的数组。

我必须指出,
train\u images.shape
返回值
(261,)
,而
train\u images[0]。shape
返回
(490640,1)


这在理论上对我来说是有意义的,但我仍然不知道如何正确地为我的CNN塑造我的数据,以及如何检测我是否做了任何其他错误。

问题是,你的一些图像大小不一样。您可以轻松验证,例如:

shapes = list()
for i in X:
    shapes.append(i.shape)

sorted_shapes = np.sort(np.array(shapes).sum(axis=1))
assert sorted_shapes[0] == sorted_shapes[1], 'Not all pictures have equal size.'

如果这一行出现错误,您将不得不裁剪/调整它们的大小。

问题是您的一些图像大小不相等。您可以轻松验证,例如:

shapes = list()
for i in X:
    shapes.append(i.shape)

sorted_shapes = np.sort(np.array(shapes).sum(axis=1))
assert sorted_shapes[0] == sorted_shapes[1], 'Not all pictures have equal size.'

如果此行出现错误,您必须裁剪/调整它们的大小。

您的输入数据是什么类型的?(带有
类型(列车图像)
)。另外,当您使用以下命令将数据转换为numpy数组时是否会出错:
numpy.array(train\u images)
?如果您首先将X和Y转换为numpy数组,然后打印
train\u images.shape
?@Nakor当我运行
type(train\u images)
,我会得到
pandas.core.series
。我尝试将其转换为numpy数组,但仍然收到相同的VALUERROR消息。@RichardX当我尝试转换时,我得到了
(261,)
Ok,以及
numpy.array(train\u images.values).shape的输出是什么?您是否也可以显示您在执行
train\u images.head()
时得到的信息?您的输入数据是什么类型的?(带有
类型(列车图像)
)。另外,当您使用以下命令将数据转换为numpy数组时是否会出错:
numpy.array(train\u images)
?如果您首先将X和Y转换为numpy数组,然后打印
train\u images.shape
?@Nakor当我运行
type(train\u images)
,我会得到
pandas.core.series
。我尝试将其转换为numpy数组,但仍然收到相同的VALUERROR消息。@RichardX当我尝试转换时,我得到了
(261,)
Ok,以及
numpy.array(train\u images.values).shape的输出是什么?你能不能也展示一下你在训练images.head()时得到了什么?没错,但即使如此,我的数据集中的前10张图像都是相同大小的(490x640)。当我将训练集和测试集限制为这些时,您的代码不会出现任何错误。但我仍然无法拟合我的模型,因为我得到了以下错误:
检查输入时出错:预期conv2d_9_输入有4个维度,但得到了形状为(8,1)的数组
这是真的,但即使如此,数据集中的前10个图像都是相同大小的(490x640)。当我将训练集和测试集限制为这些时,您的代码不会出现任何错误。但我仍然无法拟合我的模型,因为我得到了以下错误:
检查输入时出错:预期conv2d_9_输入有4维,但得到了形状为(8,1)的数组