代码之家  ›  专栏  ›  技术社区  ›  mday99

Keras是否将一系列排序列表作为输入?

  •  0
  • mday99  · 技术社区  · 6 年前

    我有一系列正在分析的视频。我们有50个视频,目前每个视频采样10帧。我们通过一个模型运行每一帧,该模型输出一个长度为7的列表(各种度量的得分)。所以我们有一个形状的X[numvideos X[numframes X[7]]]。此输出与视频中的输出顺序相同。

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

    例如,总输入列表是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在视频级别上按顺序考虑这些数据?aka使用[numframes x[7]在单个视频上输出预测?我认为我们可以以任何顺序使用帧数据建立一个好的模型,但是我相信帧的顺序(以及帧之间的变化和变化率)是有价值的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Daniel Möller    6 年前

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

    所以,如果你 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个特征)连接。