Error: expected conv3d_1_input to have 5 dimensions, but got array with shape (10, 224, 224, 3)
我正在尝试在数据集上训练神经网络以进行生动的反欺骗。 我在名为
1 2 3 | --/training/ ----/genuine/ #containes 10frame*300videos=3000images ----/fake/ #containes 10frame*800videos=8000images |
我第一次尝试使用Keras设计以下3D Convent,但是运行它之后,它将引发以下异常:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | from keras.preprocessing.image import ImageDataGenerator from keras import Model, optimizers, activations, losses, regularizers, backend, Sequential from keras.layers import Dense, MaxPooling3D, AveragePooling3D, Conv3D, Input, Flatten, BatchNormalization BATCH_SIZE = 10 TARGET_SIZE = (224, 224) train_datagen = ImageDataGenerator(rescale=1.0/255, data_format='channels_last', validation_split=0.2, shear_range=0.0, zoom_range=0, horizontal_flip=False, featurewise_center=False, featurewise_std_normalization=False, width_shift_range=False, height_shift_range=False) train_generator = train_datagen.flow_from_directory("./training/", target_size=TARGET_SIZE, batch_size=BATCH_SIZE, class_mode='binary', shuffle=False, subset='training') validation_generator = train_datagen.flow_from_directory("./training/", target_size=TARGET_SIZE, batch_size=BATCH_SIZE, class_mode='binary', shuffle=False, subset='validation') SHAPE = (10, 224, 224, 3) model = Sequential() model.add(Conv3D(filters=128, kernel_size=(1, 3, 3), data_format='channels_last', activation='relu', input_shape=(10, 224, 224, 3))) model.add(MaxPooling3D(data_format='channels_last', pool_size=(1, 2, 2))) model.add(Conv3D(filters=64, kernel_size=(2, 3, 3), activation='relu')) model.add(MaxPooling3D(pool_size=(1, 2, 2))) model.add(Conv3D(filters=32, kernel_size=(2, 3, 3), activation='relu')) model.add(Conv3D(filters=32, kernel_size=(2, 3, 3), activation='relu')) model.add(MaxPooling3D(pool_size=(1, 2, 2))) model.add(Conv3D(filters=16, kernel_size=(2, 3, 3), activation='relu')) model.add(Conv3D(filters=16, kernel_size=(2, 3, 3), activation='relu')) model.add(AveragePooling3D()) model.add(BatchNormalization()) model.add(Dense(32, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.summary() model.compile(optimizer=optimizers.adam(), loss=losses.binary_crossentropy, metrics=['accuracy']) model.fit_generator(train_generator, steps_per_epoch=train_generator.samples/train_generator.batch_size, epochs=5, validation_data=validation_generator, validation_steps=validation_generator.samples/validation_generator.batch_size) model.save('3d.h5') |
这是错误:
1 | ValueError: Error when checking input: expected conv3d_1_input to have 5 dimensions, but got array with shape (10, 224, 224, 3) |
这是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | Model:"sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv3d_1 (Conv3D) (None, 10, 222, 222, 128) 3584 _________________________________________________________________ max_pooling3d_1 (MaxPooling3 (None, 10, 111, 111, 128) 0 _________________________________________________________________ conv3d_2 (Conv3D) (None, 9, 109, 109, 64) 147520 _________________________________________________________________ max_pooling3d_2 (MaxPooling3 (None, 9, 54, 54, 64) 0 _________________________________________________________________ conv3d_3 (Conv3D) (None, 8, 52, 52, 32) 36896 _________________________________________________________________ conv3d_4 (Conv3D) (None, 7, 50, 50, 32) 18464 _________________________________________________________________ max_pooling3d_3 (MaxPooling3 (None, 7, 25, 25, 32) 0 _________________________________________________________________ conv3d_5 (Conv3D) (None, 6, 23, 23, 16) 9232 _________________________________________________________________ conv3d_6 (Conv3D) (None, 5, 21, 21, 16) 4624 _________________________________________________________________ average_pooling3d_1 (Average (None, 2, 10, 10, 16) 0 _________________________________________________________________ batch_normalization_1 (Batch (None, 2, 10, 10, 16) 64 _________________________________________________________________ dense_1 (Dense) (None, 2, 10, 10, 32) 544 _________________________________________________________________ dense_2 (Dense) (None, 2, 10, 10, 1) 33 ================================================================= Total params: 220,961 Trainable params: 220,929 Non-trainable params: 32 __________________________________________________________ |
感谢您为解决该异常提供的帮助。 顺便说一句,如果它有助于解决问题,我正在使用TensorFlow作为后端。
正如评论中提到的@ thushv89一样,Keras没有内置的视频生成器,这对于使用大型视频数据集的人会造成很多问题。 因此,我编写了一个简单的VideoDataGenerator,其工作原理几乎与ImageDataGenerator一样简单。 该脚本可以在我的github上找到,以防将来有人需要它。