使用视频训练LSTM模型的结构(帧数恒定)

时间:2017-08-26 11:48:23

标签: computer-vision deep-learning keras lstm rnn

我有数千个视频,每个视频都包含35个恒定帧数。 我尝试通过训练LSTM模型对视频进行分类。但我不确切地知道人们如何保持视频的顺序结构并训练LSTM模型。

因此,我想做的是;

  1. 从数据集中读取视频
  2. 获取该视频的35帧并通过CNN提取每帧的功能
  3. 将这35个帧功能提供给LSTM图层 - 如何逐批将每个视频(35帧)提供给LSTM?
  4. fit中的Keras功能使用率很高。然而我不知道如何在将所有数据读入内存以获得拟合函数的同时保持视频的顺序结构。

    rm.model.fit(X,y,batch_size=batch_size, validation_data=(X_test, y_test),verbose=1, epochs=100)
    

    有人可以解释一下人们如何使用视频(N帧数)训练LSTM模型

    我希望我能清楚地解释自己。

    提前致谢

1 个答案:

答案 0 :(得分:2)

documentation,我们可以看到所有Keras复现层所期望的输入形状是:

ListAdapter

在Keras形状中,(None, TimeSteps, DataDimension) 是您拥有的示例数。

因此,在第一种简单的方法中,您必须将您的训练数据塑造为:

None

你的第一层(如果第一层是LSTM)应该使用:

(NumberOfVideos, NumberOfFrames, height * width * channels)

创建模型时从不考虑批量大小(示例数量),它只出现在您的训练数据中,这就是为什么Keras在消息中显示LSTM(AnyNumberOfCells, input_shape=(NumberOfFrames, height * width * channels)) 该维度的原因

现在,这是一种非常简单直观的启动方式,但实际上,没有义务像这样塑造您的训练数据,您可以尝试各种方式,只要您为LSTM图层保留数据形状为None。一个很好的方法(在我看来)是首先做一些卷积来减少数据大小,然后再在LSTM中提供它。尺寸"高度*宽*通道"在LSTM层中同时处理所有内容可能太多了,并且可能会导致内存问题。

如果您有记忆问题。你可以学习"发电机"或Keras Sequences。这些将与方法fit_generator()一起使用。 Keras将首先使用生成器读取有限数量的数据,并仅使用该数据进行训练。但是,您必须使这些生成器以相同的格式(BatchSize,TimeSteps,DataDimension)输出内容。

现在,即使这样你还有内存问题,你也必须开始使用(ASmallerNumberOfVideos, NumberOfFrames, height * width * channels)层。

在这种情况下," TimeSteps"可以在不同的阵列中分开。你的LSTM层不会思考"好的,这个例子已经完成了#34;当你训练。您输入的下一批将被视为"继续之前的序列"。

数据形状类似于stateful=True

在这种情况下,每次训练完成序列后,您必须使用.reset_states()手动重置网络状态" ReducedNumberOfFrames"。

只要你能够很好地控制你的训练并(NumberOfVideos,ReducedNumberOfFrames, h*w)在正确的位置,你就可以通过像(ReducedNumberOfVideos,ReducedNumberOfFrames,h*w)这样的训练来结合这两个想法。