Ошибка формы ввода в слое Tensorflow / Keras Conv2D - PullRequest
1 голос
/ 12 января 2020

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

1 Ответ

0 голосов
/ 12 января 2020

Проблема в том, что некоторые из ваших изображений не имеют одинакового размера. Вы можете легко это проверить, например:

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

Если в этой строке выдается ошибка, вам придется обрезать / изменить их размер.

...