Keras 将一系列有序列表作为输入?

Keras taking a series of ordered lists as input?

我有一系列视频正在接受分析。我们有 50 个视频,现在每个视频采样 10 帧。我们 运行 每一帧都通过一个输出长度为 7 的列表(各种指标的分数)的模型。所以我们有一个形状为 [numVideos x [numFrames x [7]]] 的 X。此输出的顺序与它在视频中出现的顺序相同。

理想情况下,我们将使用这些数据训练模型,新模型将输出单个 int 分数。

例如总输入列表为shape(50,10,7)。这是 50 个视频分析之一的示例:

[[2.10857585e-01 3.44210785e-05 7.68336877e-02 6.52071908e-02
   1.59574211e-01 6.07666420e-03 4.81416196e-01]

[1.25921518e-01 3.82323651e-06 9.80229899e-02 1.59665961e-02
   5.27808852e-02 7.20748529e-02 6.35229409e-01]

[1.96348786e-01 1.39075582e-05 3.05381954e-01 8.71435739e-03
   7.70738944e-02 3.36979516e-02 3.78769159e-01]

[4.88201588e-01 4.07423446e-04 1.31438121e-01 2.09173430e-02
   5.96358590e-02 2.17649899e-02 2.77634591e-01]

[2.23202184e-01 9.74372160e-05 1.74910247e-01 2.34939177e-02
   3.35233539e-01 6.30585337e-03 2.36756831e-01]

[6.06459320e-01 2.96085584e-03 1.29230097e-01 2.59685959e-03
   1.56335548e-01 6.93407189e-03 9.54832658e-02]

[2.97920138e-01 1.25984091e-03 1.89080209e-01 5.00026112e-03
   8.90274197e-02 6.42844364e-02 3.53427678e-01]

[3.03987801e-01 6.44640977e-06 1.16339259e-01 2.88505014e-03
   1.53694913e-01 6.00992441e-02 3.62987250e-01]

[1.29550800e-01 1.86390607e-04 9.91750583e-02 2.72049874e-01
   8.33113417e-02 2.60952320e-02 3.89631271e-01]

[1.64423732e-03 2.68871787e-07 3.26379202e-04 9.86126721e-01
   5.81838889e-04 1.44834805e-03 9.87217203e-03] ]

我在这部分遇到了一些麻烦,因为我是 Keras 的新手 - 是否可以让 Keras 在视频级别按顺序考虑这些数据?也就是使用 [numFrames x [7]] 输出对单个视频的预测?我认为我们可以按任何顺序使用帧数据制作一个好的模型,但我相信帧的顺序(以及它们之间的变化和变化率)很有价值。

最基本的方法是使用循环层。它们用于按顺序处理时间步长并从中学习。

因此,如果您使 X 具有形状 (50,10,7),如 (videos, frames, features),您可以创建这样的模型:

inputTensor = Input((10,7)) #also possible with (None,7) for variable frame counts   

#some recurrent layers with return_sequences=True
output = LSTM(someUnits, return_sequences=True)(inputTensor)
output = LSTM(aFewUnits, return_sequences=True)(output)

现在,如果您想要每一帧的分数,请保留 return_sequences=True 和:

output = Dense(1, activation=someActivation)(output)
model = Model(inputTensor, output) #output shape = (50,10,1)

或者,如果你想要每个视频的总分,最后一个循环层应该有 return_sequences=False:

output = LSTM(aFewUnits, return_sequences=False)(output)
output = Dense(1, activation=someActivation)(output)
model = Model(inputTensor, output)   #output shape = (50,1)  

现在,如果您的帧是实际图像并且您想要处理这些图像,它会变得有点复杂。你应该考虑像素的存在和这个数据的形状。

假设您有 8 x 8 像素的帧,在 RGB 中,您的视频输入形状应该类似于 (50,10,8,8,3)

一种方法是先将图像重塑为特征:X.reshape((50,10,-1))
然后连接 7 个特征:X = np.concatenate([X,features], axis=-1)

然后使用该模型。

另一种方法是使用 ConvLSTM2D 层,它采用原始视频形状的输入。在模型中的某个点,您将空间维度折叠成特征(与上面相同的重塑过程)并与第二个输入连接,这将是 7 个特征)。