关于tensorflow:错误:预期conv3d_1_input具有5个维度,但数组的形状为(10,224,224,3)

Error: expected conv3d_1_input to have 5 dimensions, but got array with shape (10, 224, 224, 3)

我正在尝试在数据集上训练神经网络以进行生动的反欺骗。 我在名为genuinefake的两个文件夹中有一些视频。 我已提取每个视频的10帧并将它们保存在两个具有上述名称的文件夹中,位于新目录tarining下。

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)

这是model.summary()的输出

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上找到,以防将来有人需要它。