【发布时间】: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