使用Keras进行视频预测(时间序列)

时间:2017-03-06 19:08:03

标签: machine-learning neural-network time-series keras lstm

我想预测给定N前帧的(灰度)视频的下一帧 - 使用Keras中的CNN或RNN。关于时间序列预测和Keras的大多数教程和其他信息在他们的网络中使用一维输入,但我的将是3D (N frames x rows x cols)

我目前真的不确定这个问题的好方法是什么。我的想法包括:

  • 使用一个或多个LSTM图层。这里的问题是,我不确定他们是否适合拍摄一系列图像而不是一系列标量作为输入。内存消耗不会爆炸吗?如果可以使用它们:我如何在Keras中使用它们以获得更高的尺寸?

  • 在输入(先前视频帧的堆栈)上使用3D卷积。这提出了其他问题:当我没有进行分类而是预测时,为什么这会有所帮助呢?如何堆叠图层,使网络输入具有尺寸(N x cols x rows)和输出(1 x cols x rows)

我对CNN / RNN和Keras很陌生,并希望任何暗示正确的方向。

2 个答案:

答案 0 :(得分:21)

所以基本上每种方法都有其优点和缺点。让我们来看看你提供的那些,然后找到最好的方法:

  1. LSTM:他们最大的优势之一是能够在数据中学习长期依赖模式。它们的设计是为了能够分析长序列,例如演讲或文字。这也可能导致问题,因为数字参数可能非常高。像GRU这样的其他典型的循环网络架构可能会克服这个问题。主要的缺点是,在它们的标准(顺序实现)中,将其放在视频数据上是不可行的,原因与密集层对图像数据不利的原因相同 - 必须通过a学习时间和空间不变性的负载。拓扑结构完全不适合以有效的方式捕获它们。将视频向右移动一个像素可能会完全改变网络的输出。

    其他值得一提的是,训练LSTM被认为类似于在两个竞争过程之间找到平衡 - 为密集型输出计算找到好的权重并找到处理序列中的良好内存动态。找到这种平衡可能会持续很长时间,但一旦找到它 - 它通常非常稳定并产生非常好的结果。

  2. Conv3D:在他们最大的优势中,人们很容易找到一种能够以与Conv2D相同的方式捕捉空间和时间不变性的能力。这使得维度的诅咒的危害性大大降低。另一方面 - 与Conv1D相同的方式可能不会产生较长序列的良好结果 - 以同样的方式 - 缺乏任何记忆可能会使学习更长的序列更难。

  3. 当然可以使用不同的方法,如:

    1. TimeDistributed + Conv2D:使用TimeDistributed包装器 - 可以使用一些预先训练的信令,例如Inception按帧,然后按顺序分析要素图。这种方法的一个非常巨大的优势是转移学习的可能性。作为一个缺点 - 人们可能会将其视为Conv2.5D - 它缺乏对数据的时间分析。

    2. ConvLSTMKeras的最新版本(2017年3月6日)尚不支持此架构,但有人可能会看到here未来。这是LSTMConv2D的混合,它被认为比堆叠Conv2DLSTM更好。

    3. 当然,这些并不是解决这个问题的唯一方法,我还会提到一个可能有用的方法:

      1. 堆叠:可以轻松堆叠上层方法,以构建最终解决方案。例如。一个人可以建立一个网络,在开始时使用TimeDistributed(ResNet)转换视频,然后输出到Conv3D,并带有多个激进的空间池,最后由GRU/LSTM层转换。
      2. <强> PS:

        另外值得一提的是视频数据的形状实际为4D (frames, width, height, channels}。

        <强> PS2:

        如果您的数据实际上是3D (frames, width, hieght),您实际上可以使用经典Conv2D(通过将channels更改为frames)来分析数据(实际上可能在计算上更有效)。如果是转移学习,您应该添加其他维度,因为大多数CNN模型都是针对形状为(width, height, 3)的数据进行培训的。您可能会注意到您的数据没有3个频道。在这种情况下,通常使用的技术是重复三次空间矩阵。

        <强> PS3:

        这种2.5D方法的一个例子是:

        input = Input(shape=input_shape)
        base_cnn_model = InceptionV3(include_top=False, ..)
        temporal_analysis = TimeDistributed(base_cnn_model)(input)
        conv3d_analysis = Conv3D(nb_of_filters, 3, 3, 3)(temporal_analysis)
        conv3d_analysis = Conv3D(nb_of_filters, 3, 3, 3)(conv3d_analysis)
        output = Flatten()(conv3d_analysis)
        output = Dense(nb_of_classes, activation="softmax")(output)
        

答案 1 :(得分:9)

经过大量的研究后,我终于偶然发现了ConvLSTM2DKeras Example(MarcinMożejko已经提到过),这正是我需要的。

在当前版本的Keras(v1.2.2)中,此图层已包含在内,可以使用

导入
from keras.layers.convolutional_recurrent import ConvLSTM2D 

要使用此图层,视频数据必须按如下格式进行格式化:

[nb_samples, nb_frames, width, height, channels] # if using dim_ordering = 'tf'
[nb_samples, nb_frames, channels, width, height] # if using dim_ordering = 'th'