Я впервые строю сверточную нейронную сеть с 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, а также определить, делаю ли я что-то еще неправильно .