1

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

因此,我想做的是;

  1. 从数据集中读取视频
  2. 获取该视频的 35 帧并通过 CNN 为每一帧提取特征
  3. 将这 35 帧特征馈送到 LSTM 层 -如何将每个视频(35 帧)逐批馈送到 LSTM?

Keras中的fit函数被高度使用。但是,我不知道如何在将所有数据读入内存以进行拟合功能时保持视频的顺序结构。

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

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

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

提前致谢

4

1 回答 1

4

文档中,我们可以看到所有 Keras 循环层所期望的输入形状是:

(None, TimeSteps, DataDimension)   

在 Keras 形状中,None是您拥有的示例数量。

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

(NumberOfVideos, NumberOfFrames, height * width * channels)

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

LSTM(AnyNumberOfCells, input_shape=(NumberOfFrames, height * width * channels))

创建模型时从不考虑批量大小(示例数),它只出现在您的训练数据中,这就是 KerasNone在消息中显示该维度的原因。


现在,这是一种非常简单直观的开始方式,但实际上,没有义务像这样塑造你的训练数据,你可以尝试各种方式,只要你保持 LSTM 层的数据形状为(BatchSize,TimeSteps,DataDimension). 一个很好的方法(在我看来)是在将数据输入 LSTM 之前先进行一些卷积以减小数据大小。维度“高度 * 宽度 * 通道”可能太多了,无法在 LSTM 层中一次处理所有内容,并且可能会导致内存问题。

如果你有记忆问题。您可以研究“生成器”或Keras 序列。这些将与fit_generator()方法一起使用。Keras 将首先使用生成器读取有限数量的数据,并仅使用该数据进行训练。不过,您必须让这些生成器以相同的格式输出内容(ASmallerNumberOfVideos, NumberOfFrames, height * width * channels)

现在,即使这样你仍然有内存问题,你将不得不开始使用stateful=True层。

在这种情况下,“TimeSteps”可能被分隔在不同的数组中。当你训练时,你的 LSTM 层不会认为“好的,这个例子已经完成”。您喂食的下一批将被视为“继续上一个序列”。

数据的形状会像(NumberOfVideos,ReducedNumberOfFrames, h*w).

在这种情况下,每次在训练足够的“ReducedNumberOfFrames”后完成一个序列时,您都必须使用.reset_states()手动重置网络的状态。

你也可以通过类似的训练来结合这两个想法(ReducedNumberOfVideos,ReducedNumberOfFrames,h*w),只要你能很好地控制你的训练并且.reset_states()在正确的点上。

于 2017-08-27T14:36:50.007 回答