Ошибка измерения TensorFlow Keras для входного слоя - PullRequest
2 голосов
/ 03 февраля 2020

Я искал все решения, связанные с этим, и до сих пор не могу понять, как сформировать свои тренировочные данные, чтобы Tensorflow принял их.

Мои тренировочные данные представляют собой массив numpy shape (21005, 48, 48), где 21005 - это число элементов, а 48,48 - это изображение в градациях серого 48x48.

model.add(tf.keras.layers.Conv2D(64, kernel_size=3,activation='relu',input_shape=(48,48,1)))
model.add(tf.keras.layers.Conv2D(32, kernel_size=3,activation='relu'))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(7, activation='softmax'))

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

model.fit(image_train, emotion_train,batch_size=BATCH_SIZE,epochs=EPOCHS, verbose=1)

Однако, когда я запускаю функцию подгонки, она возвращает сообщение об ошибке :

ValueError: Error when checking input: expected conv2d_input to have 4 dimensions, but got array with shape (21005, 48, 48)

Это заставляет меня думать, что я неправильно форматирую входные данные или что-то упускаю из-за того, как Keras и TF фактически передают входное изображение во входной слой. Я попытался добавить дополнительное измерение к входной форме, чтобы позволить канал в 2d Conv слое, а также изменить форму самих изображений безрезультатно. Любой совет?

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Измените ваши данные тренировки, чтобы иметь 4-мерные измерения перед вызовом model.fit(), такие как:

image_train = np.reshape(image_train, (21005, 48, 48, 1))

Это необходимо, потому что первый слой Conv2D ожидает, что изображение будет иметь input_shape из (48,48,1)

1 голос
/ 03 февраля 2020

Когда вы выполнили предварительную обработку, вы могли прочитать изображение в режиме оттенков серого с помощью библиотеки OpenCV / PIL.

Когда вы читаете их, ваша библиотека считает изображение в градациях серого размера (48,48), а не (48,48,1), следовательно, проблема, которая у вас есть.

Решите проблему как можно скорее, а не перед подачей на вашу модель; в своем коде, где бы вы ни читали эти изображения, перед добавлением в список / массивы убедитесь, что выбрана правильная форма массива. Ниже вы можете увидеть пример OpenCV:

image = cv2.imread(filepath, 0)
#Before this np_expand_dims, image has shape (48,48)
image = np.expand_dims(image , axis=2)
#After this step, image has shape (48,48,1)
...