首页 文章

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

提问于
浏览
0

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

因此我想做的是;

  • 从数据集中读取视频

  • 获取该视频的35帧并通过CNN提取每帧的功能

  • 将这35个框架特征提供给LSTM图层 - How could I feed each video(35 frames) to LSTM batch by batch?

Keras中的fit函数使用率很高 . 但是 I do not know how could I keep the sequential structure of the video while I read all the data in to the memory for the fit function.

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

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

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

提前致谢

1 回答

  • 2

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

    (None, TimeSteps, DataDimension)
    

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

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

    (NumberOfVideos, NumberOfFrames, height * width * channels)
    

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

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

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


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

    如果你有记忆问题 . 你可以学习"generators"或Keras Sequences . 这些将与fit_generator()方法一起使用 . Keras将首先使用生成器读取有限数量的数据,并仅使用该数据进行训练 . 但是,您必须使这些发生器以相同的格式输出 (ASmallerNumberOfVideos, NumberOfFrames, height * width * channels) .

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

    在这种情况下,“TimeSteps”可以在不同的阵列中分开 . 当你训练时,你的LSTM层不会认为“好,这个例子已经完成” . 您输入的下一批将被视为“继续前一个序列” .

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

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

    你可以通过像 (ReducedNumberOfVideos,ReducedNumberOfFrames,h*w) 这样的训练来结合这两个想法,只要你能够很好地控制你的训练并在正确的点上进行训练 .

相关问题