Tensorflow 数据预处理-时间分布CNN(LRCN)的输入形状&;用于视频分类的ConvLSTM2D

Tensorflow 数据预处理-时间分布CNN(LRCN)的输入形状&;用于视频分类的ConvLSTM2D,tensorflow,deep-learning,keras,computer-vision,Tensorflow,Deep Learning,Keras,Computer Vision,我正在尝试对300多个视频的标记数据进行二进制分类。目标是使用ConvNet提取特征,并在评估视频中的所有帧后,将其输入到LSTM,以二进制输出进行排序。我已经对每个视频进行了预处理,使其具有正好200帧的图像,每个图像为256 x 256,这样就可以更容易地输入DNN并将数据集拆分为两个文件夹作为标签。(例如狗和猫) 然而,在搜索stackoverflow几个小时后,我仍然不确定如何重新塑造视频帧的数据集,以便该模型考虑帧的数量。我正在尝试将视频帧输入到3D ConvNets和TimeDist

我正在尝试对300多个视频的标记数据进行二进制分类。目标是使用ConvNet提取特征,并在评估视频中的所有帧后,将其输入到LSTM,以二进制输出进行排序。我已经对每个视频进行了预处理,使其具有正好200帧的图像,每个图像为
256 x 256
,这样就可以更容易地输入DNN并将数据集拆分为两个文件夹作为标签。(例如狗和猫)

然而,在搜索stackoverflow几个小时后,我仍然不确定如何重新塑造视频帧的数据集,以便该模型考虑帧的数量。我正在尝试将视频帧输入到
3D ConvNets
TimeDistributed(2DConvNets)+LSTM
,但没有运气。我能够执行2D ConvNet分类(数据是
4D张量
),需要添加时间步长维度以使其成为
5D张量
)很容易,但现在有问题与时间方面的争论


我一直在使用Keras
ImageDataGenerator
train\u datagen.flow\u from\u directory
读取图像,并且在尝试将其馈送到
TimeDistributed ConvNet
时遇到了
形状不匹配
错误。假设我有一个
X\u列
数据集,我就知道我可以做
X\u列=X\u列。重塑(…)
。任何示例代码都将不胜感激

我认为您可以在Keras中使用
ConvLSTM2D
ImageDataGenerator
对于有图像的CNN非常好,但对于有视频的CRNN可能不方便

您已经将300个视频数据转换为相同的形状(200、256、256、3),每个视频200帧,每个帧256x256 rgb。接下来,您需要将它们加载到形状为(300200256256,3)的numpy数组中。要阅读numpy阵列中的视频,请参见

然后,您可以将数据输入到CRNN中。它的第一个
ConvLSTM2D
层应该有
input\u shape=(None,200,256,256,3)

根据您的数据制作的样品:(仅图示,未测试)


我希望这会有点帮助。

您好,我收到错误信息:-ValueError:输入0与层conv_lst_m2d_12不兼容:预期ndim=5,发现ndim=6@Saikat看起来你的输入数据被转换成了6维的东西。检查输入数据是否准备错误。批次尺寸不应包含在输入形状中。因此,它应该是(200256,256,3),而不是输入_shape=(None,200256,256,3)@Saikat这就是为什么您会收到此ValueError。。
from keras.models import Sequential
from keras.layers import Dense
from keras.layers.convolutional_recurrent import ConvLSTM2D

model = Sequential()
model.add(ConvLSTM2D(filters = 32, kernel_size = (5, 5), input_shape = (None, 200, 256, 256, 3)))
### model.add(...more layers)
model.add(Dense(units = num_of_categories, # num of your vedio categories
                kernel_initializer = 'Orthogonal', activation = 'softmax'))
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])

# then train it
model.fit(video_data, # shape (300, 200, 256, 256, 3)
          [list of categories],
          batch_size = 20,
          epochs = 50,
          validation_split = 0.1)