【问题标题】:Input shape error in Tensorflow/Keras Conv2D layerTensorflow/Keras Conv2D 层中的输入形状错误
【发布时间】:2020-04-29 04:21:57
【问题描述】:

我是第一次使用 Keras 构建卷积神经网络,但遇到了一些问题。 CNN 的目的是检测 490x640px 灰度图像中的模式,我已将其转换为 3D numpy 数组。我的 Pandas 数据框的图像数据列中的每张图像都具有(490, 640, 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

然后我有以下内容:

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_1_input 有 4 个维度,但得到的数组形状为 (261, 1)

我必须指出train_images.shape 返回值(261,),而train_images[0].shape 返回(490, 640, 1)。

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

【问题讨论】:

  • 你输入的数据是什么类型的? (type(train_images))。此外,当您将数据转换为 numpy 数组时是否会出现错误:numpy.array(train_images)?
  • 如果先将 X 和 Y 转换为 numpy 数组然后打印 train_images.shape 会返回什么?
  • @Nakor 当我运行type(train_images) 时,我得到pandas.core.series.Series。我尝试将其转换为 numpy 数组,但仍然收到相同的 ValueError 消息。
  • @RichardX 当我尝试这样做时,我得到了(261,)
  • 好的,numpy.array(train_images.values).shape 的输出是什么?你也可以展示你在train_images.head()时得到的东西吗?

标签: python pandas tensorflow keras conv-neural-network


【解决方案1】:

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

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.'

如果此行引发错误,您将不得不裁剪/调整它们的大小。

【讨论】:

  • 没错,但即便如此,我数据集中的前 10 张图像都是相同大小 (490x640)。当我将训练集和测试集限制为这些时,您的代码不会出现任何错误。但是我仍然无法适应我的模型,因为我收到了这个错误:Error when checking input: expected conv2d_9_input to have 4 dimensions, but got array with shape (8, 1)
猜你喜欢
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多