我想预测给定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很陌生,并希望任何暗示正确的方向。
答案 0 :(得分:21)
所以基本上每种方法都有其优点和缺点。让我们来看看你提供的那些,然后找到最好的方法:
LSTM
:他们最大的优势之一是能够在数据中学习长期依赖模式。它们的设计是为了能够分析长序列,例如演讲或文字。这也可能导致问题,因为数字参数可能非常高。像GRU
这样的其他典型的循环网络架构可能会克服这个问题。主要的缺点是,在它们的标准(顺序实现)中,将其放在视频数据上是不可行的,原因与密集层对图像数据不利的原因相同 - 必须通过a学习时间和空间不变性的负载。拓扑结构完全不适合以有效的方式捕获它们。将视频向右移动一个像素可能会完全改变网络的输出。
其他值得一提的是,训练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个频道。在这种情况下,通常使用的技术是重复三次空间矩阵。
<强> 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)
经过大量的研究后,我终于偶然发现了ConvLSTM2D
层Keras 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'