Ошибка при проверке ввода модели: ожидается, что 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