【问题标题】:Having trouble training multidimensional data (4d numpy matrix) in sklearn and pybrain在 sklearn 和 pybrain 中训练多维数据(4d numpy 矩阵)时遇到问题
【发布时间】:2015-09-14 03:34:27
【问题描述】:

我正在训练一个通过面部运动检测情绪的情绪识别系统,并且我有一个我正在尝试训练的 4 维矩阵。但是,sklearn 不允许我训练矩阵。我正在做的是尝试通过创建一组视频来对每种情绪进行分类

构成 4D 矩阵的特征:
视频数量(每个视频都将被分配情感标签)
每个视频的帧数
每帧面部标志的方向
每帧面部标志的速度

我正在尝试训练的实际特征矩阵:
左侧是速度(每帧相同面部标志之间的斜边)
右边是方向(每帧相同面部标志的x和y值的反正切)

>> main.shape
(2, 17, 68, 2)
# 2 videos, 17 frames per video, 68 facial landmarks, 2 features (direction and speed)
>> main
array([[[[ 0.        ,  0.        ],
         [ 0.        ,  0.        ],
         [ 0.        ,  0.        ],
         ..., 
         [ 0.        ,  0.        ],
         [ 0.        ,  0.        ],
         [ 0.        ,  0.        ]],

        [[-1.        , -0.        ],
         [-1.        , -0.        ],
         [-1.        , -0.        ],
         ..., 
         [ 0.        ,  0.        ],
         [ 1.41421356,  0.78539816],
         [ 1.        ,  0.        ]],

        [[ 3.16227766, -1.24904577],
         [ 2.23606798, -1.10714872],
         [ 2.23606798, -1.10714872],
         ..., 
         [ 1.41421356, -0.78539816],
         [-1.41421356,  0.78539816],
         [-2.        , -0.        ]],

        ..., 
        [[-3.60555128, -0.5880026 ],
         [-2.23606798, -0.46364761],
         [-2.23606798, -0.46364761],
         ..., 
         [ 3.        ,  0.        ],
         [ 2.23606798,  0.46364761],
         [ 0.        ,  0.        ]],

        [[ 2.82842712, -0.78539816],
         [ 2.23606798, -1.10714872],
         [ 2.23606798, -1.10714872],
         ..., 
         [ 1.41421356,  0.78539816],
         [ 1.        ,  1.        ],
         [ 1.        ,  1.        ]],

        [[-1.41421356,  0.78539816],
         [ 0.        ,  0.        ],
         [ 0.        ,  0.        ],
         ..., 
         [-2.23606798,  1.10714872],
         [-2.23606798,  1.10714872],
         [ 2.        ,  1.        ]]],


       [[[ 0.        ,  0.        ],
         [ 0.        ,  0.        ],
         [ 0.        ,  0.        ],
         ..., 
         [ 0.        ,  0.        ],
         [ 0.        ,  0.        ],
         [ 0.        ,  0.        ]],

        [[-1.        , -0.        ],
         [-1.        , -0.        ],
         [-1.        , -0.        ],
         ..., 
         [ 0.        ,  0.        ],
         [ 1.41421356,  0.78539816],
         [ 1.        ,  0.        ]],

        [[ 3.16227766, -1.24904577],
         [ 2.23606798, -1.10714872],
         [ 2.23606798, -1.10714872],
         ..., 
         [ 1.41421356, -0.78539816],
         [-1.41421356,  0.78539816],
         [-2.        , -0.        ]],

        ..., 
        [[-3.60555128, -0.5880026 ],
         [-2.23606798, -0.46364761],
         [-2.23606798, -0.46364761],
         ..., 
         [ 3.        ,  0.        ],
         [ 2.23606798,  0.46364761],
         [ 0.        ,  0.        ]],

        [[ 2.82842712, -0.78539816],
         [ 2.23606798, -1.10714872],
         [ 2.23606798, -1.10714872],
         ..., 
         [ 1.41421356,  0.78539816],
         [ 1.        ,  1.        ],
         [ 1.        ,  1.        ]],

        [[-1.41421356,  0.78539816],
         [ 0.        ,  0.        ],
         [ 0.        ,  0.        ],
         ..., 
         [-2.23606798,  1.10714872],
         [-2.23606798,  1.10714872],
         [ 2.        ,  1.        ]]]])

我从 sklearn SVM 得到的错误:

ValueError: Buffer has wrong number of dimensions (expected 2, got 4)

然后我尝试使用更简单的 3D 矩阵来查看是否可以找到解决方法,但它给了我同样的错误:

>>> from sklearn.svm import SVC
>>> model = SVC()
>>> features = np.array([[[1,2],[3,4]],[[8,9],[10,11]]])
>>> features.shape
(2, 2, 2)
>>> labels = [1,2]
>>> model.fit(features,labels)
ValueError: Buffer has wrong number of dimensions (expected 2, got 3)

其他 sklearn 算法(如朴素贝叶斯)给我类似的错误,说它们只接受 2D 矩阵。

我认为问题并不在于我的实现,而是 SVM、朴素贝叶斯和其他机器学习算法通常不能处理超过 2 维的数据。

我尝试使用 pybrain 中的神经网络,但无法找到将矩阵输入 pybrain 神经网络的方法。

我虽然有可能使用 PCA 或重构矩阵的设计,但我更愿意保持这些特征和相同的维度,而不是乱用它们。

我可以使用任何方法、机器学习算法或神经网络来训练 4D 矩阵吗?

【问题讨论】:

  • 如何解释 4D 矩阵输入?在 2D 中,我们知道行是观察/实例,而列是特征。您如何解释其他两个维度?
  • 一种常见的方法是将 4D 矩阵重塑为 2D。一个紧密的例子是训练一个用于图像识别的算法,其中图像具有 3D(宽度、高度和 RGB 颜色混合)。为了将此输入矩阵提供给 sklearn 算法,您可以重塑为(宽度 x 高度)x 3-RGB-color。
  • 我正在考虑将三个特征组合到一个向量中,但问题是如果我组合我的特征矩阵(编辑后的帖子以显示我正在尝试训练的矩阵),它只会搞砸每个不同的特征值的优势和机器学习算法将很难理解这些值并且不会很好地训练。
  • 例如,我不能将我的方向和速度特征组合在一起,因为这会混淆正负号(两者都表示特征点是否移动东北、西北、东南,或从先前位置的西南方向)。有什么巧妙的方法可以结合这些功能?
  • 所以你想把方向和速度特征组合成一个单一的特征,这就是你选择4D矩阵的原因?我不确定我是否理解您的数据,但我会尝试将所有这些方向视为分类变量并将它们设为数字虚拟变量。

标签: matrix machine-learning neural-network scikit-learn pybrain


【解决方案1】:

从您的示例中不清楚哪个是样本轴。但是 sklearn 中的训练可以这样完成(如果第一个轴是您的样本轴):

model.fit(features.reshape(len(features), -1), labels)

了解任何 sklearn 分类器的 4D 结构没有任何好处。整个包采用的标准,以确保简单和清晰,是让第一个矩阵维度枚举示例,第二个矩阵维度枚举特征。因此,在您的情况下,您需要将剩余的 3 个特征维度分解为一个长向量。

【讨论】:

  • 我正在考虑将三个特征组合到一个向量中,但问题是如果我组合我的特征矩阵(编辑后的帖子以显示我正在尝试训练的矩阵),它只会搞砸每个不同的特征值的优势和机器学习算法将很难理解这些值并且不会很好地训练。
  • 例如,我不能将我的方向和速度特征组合在一起,因为这会混淆正负号(两者都表示特征点是否移动东北、西北、东南,或从先前位置的西南方向)。有什么巧妙的方法可以结合这些功能?
猜你喜欢
  • 2019-12-13
  • 2013-01-07
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多