所以基本上每种方法都有其优缺点。让我们先看看你提供的方法,然后再找到最佳方法:
LSTM
:它们最大的优点之一是能够学习数据中长期依赖模式,旨在分析长序列,例如语音或文本。但由于参数数量可能非常高,这也可能会导致问题。其他典型的循环网络架构,如GRU
,可能会克服这些问题。其主要缺点是,在其标准(顺序实现)中,与密集层不适合处理图像数据的原因相同,无法将其拟合到视频数据上-必须通过完全不适合以有效方式捕获它们的拓扑结构来学习许多时间和空间不变性。将视频向右移动一个像素可能会完全改变您的网络输出。
值得一提的另一件事是,人们认为训练LSTM
类似于在两个竞争过程之间找到平衡-找到用于密集型输出计算的良好权重,并找到在处理序列时具有良好内存动态的平衡。找到这种平衡可能需要很长时间,但一旦找到-通常非常稳定并产生非常好的结果。
Conv3D
:它们最大的优点之一是能够以与图像情况下的Conv2D
相同的方式捕获空间和时间不变性。这使得维数诅咒变得不那么有害。另一方面-与Conv1D
可能无法处理较长序列的结果相同-缺乏任何内存可能会使学习长序列变得更加困难。
当然,您可以使用不同的方法,例如:
3.
TimeDistributed + Conv2D
: 使用
TimeDistributed
包装器 - 可以使用一些预训练的convnet,如
Inception
逐帧分析特征映射。这种方法的真正巨大优势是可以进行迁移学习。作为缺点 - 人们可能会认为它是一个
Conv2.5D
- 它缺少对数据的时间分析。
4.
ConvLSTM
: 这种架构目前还不受最新版本的
Keras
支持(截至2017年3月6日),但是如
here所示,将来应该会提供支持。这是
LSTM
和
Conv2D
的混合体,被认为比堆叠
Conv2D
和
LSTM
更好。
当然,这些并不是解决这个问题的唯一方法,我会提及另外一个可能有用的方法:
- 堆叠:可以轻松地将上述方法堆叠起来以构建最终解决方案。例如,可以构建一个网络,在视频经过 TimeDistributed(ResNet) 转换后,输出被送入 Conv3D 进行多次和积极的空间池化,最终由 GRU/LSTM 层转换。
附言:
还有一件值得一提的事情是,视频数据的形状实际上是 4D,具有 (frames, width, height, channels)。
附言2:
如果您的数据实际上是
3D
,具有
(frames, width, height)
的形式,您实际上可以使用经典的
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)