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

标签 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 还很陌生,如果有任何正确方向的提示,我将不胜感激。

    最佳答案

    所以基本上每种方法都有其优点和缺点。让我们仔细检查您提供的方法,然后再检查其他方法以找到最佳方法:

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

    其他值得一提的是培训LSTM被认为类似于在两个竞争过程之间找到平衡 - 为类似密集的输出计算找到良好的权重,并在处理序列中找到良好的内存动态。找到这种平衡可能会持续很长时间,但一旦找到 - 它通常会非常稳定并产生非常好的结果。
  • Conv3D :在它们最大的优势中,人们可以很容易地找到以与 Conv2D 相同的方式捕获空间和时间不变性的能力。在图像的情况下。这使得维度灾难的危害性大大降低。另一方面 - 与 Conv1D 相同。使用更长的序列可能不会产生好的结果 - 以同样的方式 - 缺乏任何内存可能会使学习长序列变得更加困难。

  • 当然,可以使用不同的方法,例如:
  • TimeDistributed + Conv2D : 使用 TimeDistributed包装器 - 可以使用一些预训练的卷积网络,例如Inception逐帧,然后按顺序分析特征图。这种方法的一个真正巨大的优势是迁移学习的可能性。作为一个缺点 - 人们可能会将其视为 Conv2.5D - 它缺乏对您的数据的时间分析。
  • ConvLSTM : 最新版本的 Keras 尚不支持此架构(2017 年 3 月 6 日),但正如大家所见 here它应该在将来提供。这是 LSTM 的混合和 Conv2D它被认为比堆叠更好Conv2DLSTM .

  • 当然这些不是解决这个问题的唯一方法,我会再提一个可能有用的方法:
  • 堆叠:可以轻松堆叠上层方法以构建最终解决方案。例如。可以建立一个网络,开始时使用 TimeDistributed(ResNet) 转换视频然后输出馈送到Conv3D具有多个积极的空间池化,最后由 GRU/LSTM 转换层。

  • PS:

    还有一点值得一提的是,视频数据的形状实际上是4D。与 (frames, width, height, channels )。

    PS2:

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

    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)
    

    关于machine-learning - 使用 Keras 进行视频预测(时间序列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42633644/

    相关文章:

    python - 使用 keras、tensorflow 和 python 编写这种异国情调的神经网络架构

    python - Pandas :groupby并计算每组中第一个元素的时间差

    mysql - 合并2个时间序列

    neural-network - 用于异常值检测的复制器神经网络,导致相同预测的步进函数

    machine-learning - 是否有关于检测乐器是否演奏正确音符的论文或模型?

    python - 在对玻尔兹曼机执行对比散度时,我收到以下错误。我正在使用最新版本的 pytorch

    machine-learning - cudnn:当 CUDNN_SOFTMAX_ACCURATE 工作正常时,CUDNN_SOFTMAX_FAST 输出 NaN

    machine-learning - keras CNN 1-D -> 为什么所有预测类返回的结果相同?

    r - 如何将 30 个粒度数据聚合为 5 分钟数据

    python - tensorflow ,凯拉斯。使用 bool 数组作为输入构建模型