Ошибка при проверке ввода модели: ожидается, что convolution2d_input_1 имеет 4 измерения, но получил массив с формой (32, 32, 3)
Я хочу обучить глубокую сеть, начиная со следующего слоя:
model = Sequential()
model.add(Conv2D(32, 3, 3, input_shape=(32, 32, 3)))
используя
history = model.fit_generator(get_training_data(),
samples_per_epoch=1, nb_epoch=1,nb_val_samples=5,
verbose=1,validation_data=get_validation_data()
со следующим генератором:
def get_training_data(self):
while 1:
for i in range(1,5):
image = self.X_train[i]
label = self.Y_train[i]
yield (image,label)
(генератор проверки похож).
Во время обучения я получаю сообщение об ошибке:
Error when checking model input: expected convolution2d_input_1 to have 4
dimensions, but got array with shape (32, 32, 3)
Как это может быть, с первым слоем
model.add(Conv2D(32, 3, 3, input_shape=(32, 32, 3)))
?
Ответы
Ответ 1
Форма ввода, которую вы определили, представляет собой форму одного образца. Сама модель ожидает, что в качестве входных данных будет использован некоторый массив выборок (даже если его массив длиной 1).
Ваш вывод действительно должен быть 4-й, с 1-м измерением для перечисления образцов. то есть для одного изображения вы должны вернуть форму (1, 32, 32, 3).
Вы можете найти дополнительную информацию здесь в разделе "Convolution2D" / "Форма ввода"
Ответ 2
Это так же просто, как добавить одно измерение, поэтому я просматривал учебное пособие Сираджа Равала по обучению развертыванию кода CNN, оно работало на его терминале, но тот же код не работал на моем терминале, поэтому я провел некоторое исследование об этом и решил, я не знаю, работает ли это для вас всех. Здесь я нашел решение;
Неразрешенные строки кода, которые вызывают проблемы:
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
print(x_train.shape)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols)
input_shape = (img_rows, img_cols, 1)
Решенный код:
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
print(x_train.shape)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
Пожалуйста, поделитесь отзывами здесь, если это сработало для вас.
Ответ 3
x_train = x_train.reshape(-1,28, 28, 1) #Reshape for CNN - should work!!
x_test = x_test.reshape(-1,28, 28, 1)
history_cnn = cnn.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test))
Выход:
Поезд на 60000 образцов, проверка на 10000 образцов. Эпоха 1/5 60000/60000 [=============================] - 157 с 3 мс/шаг - потеря: 0,0981 - в соответствии: 0,9692 - потеря_валю: 0,0468 - val_acc: 0,9861 эпоха 2/5 60000/60000 [============================= =======] - 157 с 3 мс/шаг - потеря: 0,0352 - согласно: 0,9892 - val_loss: 0,0408 - val_acc: 0,9879 Epoch 3/5 60000/60000 [============= =================] - 159 с 3 мс/шаг - потеря: 0,0242 - в соответствии: 0,9924 - val_loss: 0,0291 - val_acc: 0,9913 Epoch 4/5 60000/60000 [=== ===========================] - 165 с 3 мс/шаг - потеря: 0,0181 - согласно: 0,9945 - val_loss: 0,0361 - val_acc: 0,9888 Epoch 5/5 60000/60000 [=====================================] - 168 с 3 мс/шаг - потеря: 0,0142 - согласно: 0.9958 - val_loss: 0.0354 - val_acc: 0.9906