我想预测给定 N
的(灰度)视频的下一帧以前的帧 - 在 Keras 中使用 CNN 或 RNN。大多数关于时间序列预测和 Keras 的教程和其他信息在他们的网络中使用一维输入,但我的将是 3D (N frames x rows x cols)
我目前真的不确定解决这个问题的好方法是什么。我的想法包括:
(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
它被认为比堆叠更好Conv2D
和 LSTM
. 当然这些不是解决这个问题的唯一方法,我会再提一个可能有用的方法:
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/